SoloCodigo
Programación General => C/C++ => Mensaje iniciado por: pacorubio77 en Domingo 31 de Mayo de 2009, 02:07
-
Hola,queria preguntarle si sabia la causa del siguiente "Fallo de segmentacion",ya que no entiendo el porque y llevo días,buscando la causa.
si yo tengo el siguiente programa:
#include<iostream>
#include<fstream>
#include<string>
const int Ksimbol=5;
const int Kmax=100;
struct TNodo{
int est;
int Matriz[Ksimbol][Kmax];
char sim[Ksimbol];
};
struct TAfd{
int estado;
int vestados[Kmax];
TNodo v1[Kmax];
};
//TAfd v[100];
using namespace std;
int main(int argc,char *argv[]){
//Talumno v[1000];
TAfd v[100];
cout<<argv[1]<<endl;
}
//Mi pregunta es porque ahora declarándome TAfd v[100] como local, me da un fallo de segmentación,pero esa misma variable declarándomela como global, no me da error,le he puesto ese programa ,para simplificar mi duda, ya que mi programa es mucho más extenso,pero es el caso,pero minimizado.
¿Me puede decir la causa de que por una parte me da fallo de segmentacion y por otra parte no?
Mi version de compilador es la 4.1.2 y tengo instalado el valdring(que creo que es el que me detecta el fallo),ya que en un compilador como un 3.1.6 no detecta el siguiente fallo,siempre en c++;
Un saludo,espero respuesta.
Gracias.
-
stack overflow, no podes ocupar tantos bytes en la pila (20.160.400), no existen.
-
que quiere decir que no puedo ocupar tantos bytes en la pila (20,40,...), ? y como variable global si?, es que a mi me prohiben utilizar variables globales que no sean constantes...me ponen directamente un 0, y como variable global no me da error,pero si como local, me podría ayudar y decir como utilizarla? además de explicarme lo de la pila?
-
La pila es muy chica y tu codigo ocupa unos 20 MILLONES de bytes, una variable global no va en la pila y no tiene ese problema. Usa memoria dinamica y listo.
-
lo que me dice usted es que TAfd v[100], lo haga dinámico?, como expreso eso? para hacerlo dinámico? me puede decir la definicion para hacerlo dinámico?
-
Reservar:
TAfd *v = new TAfd[100];
Usar
Liberar:
delete[] v;
-
Reservar:
TAfd *v = new TAfd[100];
Usar
Liberar:
delete[] v;
El objetivo de utilizar memoria dinámica es porque las posiciones de v que no se ocupan se pueden borrar?, la asignacion y todol o demás es idéntico que con los vectores estáticos?
Otra pregunta, ahora estoy reservando 100 posiciones para un TAfd, pero las que no se usan, tengo que hacer delete? porque si lo que queremos es sólo utilizar la memoria que usamos y la que no usamos eliminarla, tendría que hacer delete en lo que no uso?
Y una ultima pregunta, si yo antes, TAfd v[100], era una parametro de una funcion...por ejemplo
void MiFuncion(v), cuyo prototipo es void MiFunciion(TAfd v[]) ,ahora como lo meto como parámetro? tengo que cambiar la notacion ?cual sería la correcta?
Un saludo,espero respuesta.
Gracias.
-
El objetivo de utilizar memoria dinámica es porque las posiciones de v que no se ocupan se pueden borrar?, la asignacion y todol o demás es idéntico que con los vectores estáticos?
No, las variables locales se reservan en la pila, la asignación de memoria se reserva del montículo (heap).
ahora estoy reservando 100 posiciones para un TAfd, pero las que no se usan, tengo que hacer delete?
Si la reservas en lo mismo que usarla y por tanto debes hacer delete. Si no las usas, no las reserves y asi optimizas tu programa.
ahora como lo meto como parámetro? tengo que cambiar la notacion ?cual sería la correcta?
No hay diferencia con antes.
-
Es decir despues de utilizarlo debo de hacer delete []v?, para borrar el vector? o tengo que hacer
for(int i=0;i<100;i++){
delete[i]v
}
?? porque estó es para liberar memoria..verdad?
-
Es decir despues de utilizarlo debo de hacer delete []v?, para borrar el vector? o tengo que hacer
Si, tal y como figura en el que codigo de ejemplo que te di: