Matriz de longitud variable de una estructura

Buenas.
Me podriais decir porque este codigo me da error en la ejecución???? Me estoy volviendo loco y no logro comprenderlo...

#include <iostream>
using namespace std;

struct uno{         //Estructura
        int numero;
        string nombre;
       
};

int main() {         //Funcion main
       
     for (int n=1; n>0; n++) {              //Bucle infinito for
                        uno nuevo[n];  
                        uno *p;
                        p = &nuevo[n];
                        nuevo[n].numero=n;
                cout<<"Numero de registro: "<<nuevo[n].numero<<endl;
                cout<<"Indica nombre: ";
                cin>>nuevo[n].nombre;
 
        };

return 0;

};

Muchisisismas gracias por adelantado!!

No programo en C, pero si en java ... y CREO que en esta parte:

for (int n=1; n>0; n++) {              //Bucle infinito for
                        uno nuevo[n];  
                        uno *p;
                        p = &nuevo[n];
                        nuevo[n].numero=n;
                cout<<"Numero de registro: "<<nuevo[n].numero<<endl;
                cout<<"Indica nombre: ";
                cin>>nuevo[n].nombre;
 
        };

te falta un return de tipo entero....

recuerda que si usas una funcion tipo entera... en todas las posibilidades de entrada de datos tiene que ir un Return de tipo Entero ( int) ..

Espero que te sirva , Saludos :D

Lo de que es longitud variable te lo has inventado, porque el tamaño del array que se crea se determina en tiempo de compilación, a tí te parece que con la declaración del array "nuevo" dices que tenga el tamaño de n, pero como te dije, los arrays son elementos estáticos, por lo tanto el tamaño se definió durante la compilación y resulta ser de tamaño 1 (ya que n es igual a 1 en la declaración de la variable).

Por este motivo cuando intentas escribir por segunda vez estás intentando escribir en una dirección de memoria que no pertenece al array, es decir te saliste del array (que majo es c++ :) ), y como el sistema no le ha asignado a tu programa esa dirección de memoria te sale un fallo de segmentación.

La solución es hacerlo con memoria dinámica, a.k.a. usando la librería malloc, o usando una lista.

aaaaaaaaaaaaaaah, ok.
Entonces porque esto no falla??

int main() {         //Funcion main

     for (int n=1; n>0; n++) {              //Bucle infinito for
                        uno nuevo[n];
                        uno *p;
                        p = &nuevo[n];
                        nuevo[n].numero=n;
                cout<<"Numero de registro: "<<nuevo[n].numero<<endl;
               
        };

Esto se ejecuta perfectamente.

uid0 escribió:

aaaaaaaaaaaaaaah, ok.
Entonces porque esto no falla??

int main() {         //Funcion main

     for (int n=1; n>0; n++) {              //Bucle infinito for
                        uno nuevo[n];
                        uno *p;
                        p = &nuevo[n];
                        nuevo[n].numero=n;
                cout<<"Numero de registro: "<<nuevo[n].numero<<endl;
               
        };

Esto se ejecuta perfectamente.

que se ejecute perfectamente no quiere decir que esté bien

Efectivamente este tipo de errores de programación no siempre saltan en la ejecución. Estás escribiendo en un espacio de memoria que no has reservado. Si tienes suerte y no estaba reservado no saltará, pero cuando lo lleves a otra máquina o lo ejecutes en otras circunstacias o añadas un simple printf puede que salte.

aaaaaaaaaaaah si, claro, cierto es, jeje.

Bueno, pues sigo investigando...

muchas gracias!!

Resumiendo: memoria dinámica.

Hoy me dió por mirar con el depurador lo que hacía el programa este, lo que hace el código es válido, según se le va indicando "agranda" el array, por lo visto en el estándar c99 de C existen los arrays de longitud variable, cuya existencia desconocía, que permiten determinar el tamaño del array en tiempo de ejecución en lugar de en tiempo de compilación. Aunque me sigue pareciendo mejor usar memoria dinámica, ya que la puedes liberar cuando no la necesites y puedes comprobar que dispones de ella.

http://en.wikipedia.org/wiki/Variable-length_array

Si lo compilas con la opción -pedantic te avisa de esto.

Todos los días se aprende algo nuevo, parece que todavía me falta bastante por aprender. :)

Te sugiero que busques ejemplos de las clases:
-Vector
-queue

No se que tanto sepas de programación en C++
pero te dejo un ejemplo que utiliza la clase vector, espero te sirva.

//Autor:Jose Emmanuel
//Fecha:Agosto 19 del 2011
#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Estudiante{
public:
Estudiante(string name, string matricula)
{
this->name = name;
this->matricula = matricula;
}
void printEstudiante() const
{
cout << this->name << endl;
cout << this->matricula << endl;
}
private:
string name;
string matricula;
};

int main(int argc, char* argv[])
{
vector<Estudiante> estudiantesVector;
bool work=true;
while(work)
{
cout << "Agregar Nuevo Estudiante?" << endl;
string temp;
cin >> temp;
if(temp == "No" || temp == "no")
break;
string name;
string matricula;
cout << "Informacion del estudiante" << endl;
cout << "Nombre: ";
cin >> name;

cout <<"Matricula: ";
cin >> matricula;

//crear un objeto o instancia temporal
Estudiante e(name, matricula);
//Insertar al final de la lista
estudiantesVector.push_back(e);

cout << endl << endl;
cout << "Estudiantes ingresados" << endl;
for(int i=0; i<estudiantesVector.size();i++)
estudiantesVector[i].printEstudiante();

}
cout << "Good Bye" << endl;
return 0;
}