Pregunta sencilla de memoria en C.

Iniciado por astinx, 26 Febrero 2012, 19:35 PM

0 Miembros y 1 Visitante están viendo este tema.

astinx

Hola, estoy tratando de hacer un ejemplo que muestre los segmentation fault, cuando uno aloca memoria para un arreglo y se va mas allá de este. Por ejemplo:

int main(int argc, char** argv)
{
int *vec1 = (int*) malloc (sizeof(int)*3);
int *vec2 = (int*) calloc (3,sizeof(int));
int *vec3 =  NULL;
vec3 = (int*) realloc (vec3, sizeof(int)*3);
int x;
for (x=0; x<5; x++)
{
vec1[x]=x;
}
for (x=0; x<5; x++)
{
*(vec2+x)=x;
}
for (x=0; x<5; x++)
{
*(vec3+x)=x;
}
return 0;
}


Pese a que aloque memoria para solo tres elementos, en cada vector, no me tira segmentetion fault, cuando pisa el 4to o 5to elemento del arreglo, ¿Que significa?, ¿Estoy haciendo algo mal sin darme cuenta?, ¿Aloque memoria de mas sin darme cuenta?
La programación hoy en día es una carrera entre los ingenieros de software intentando construir mejores y más eficientes programas a prueba de idiotas y el Universo intentando producir mejores y más grandes idiotas. De momento, el Universo está ganando

El_Java

No estoy del todo seguro, pero el segmentation fault ocurre cuando el CPU intenta acceder a una zona de memoria físicamente imposible a la que acceder, en el caso de tu código lo que ocurre es un overflow, eso significa que zonas de memoria que no pertencen al array han sido rellenadas con el valor de este array.

puedes verlo en este codigo:
Código (cpp) [Seleccionar]
#include <iostream>

int main(){
    int arr1[3];
    int arr2[3];

    for(int a=0; a<6; a++) arr1[a] = a;

    cout << "arr1" << endl;
    for(int a=0; a<3; a++) cout << arr1[a] << endl;
    cout << "arr2" << endl;
    for(int a=0; a<3; a++) cout << arr2[a] << endl;

    return 0;
}


Salida:
arr1
0
1
2
arr2
3
4
5


Espero que te sirva. :D
SALUDOS!

Eternal Idol

La minima unidad de memoria reservada por el procesador es una pagina y esta suele ocupar 4096 bytes. Seguramente si te pasas MAS lograras tu objetivo y sino simplemente intenta desreferenciar un puntero nulo ...

El_Java: no, memoria virtual, en S.O. modernos los programas siempre trabajan con memoria virtual.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

astinx

Ah perfecto, disculpen, no sabia que era overflow, yo pensaba que pisar mas allá del espacio reservado también era considerado segmentation fault y buscaba que me tirara ese error.

Muchas gracias por responder.
La programación hoy en día es una carrera entre los ingenieros de software intentando construir mejores y más eficientes programas a prueba de idiotas y el Universo intentando producir mejores y más grandes idiotas. De momento, el Universo está ganando

Eternal Idol

Si lo es:

http://en.wikipedia.org/wiki/Segmentation_fault#Common_causes

Proba con x siendo 5000 por ejemplo o sino la mas simple del mundo:

char *p = 0;
*p = 5;
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

astinx

La programación hoy en día es una carrera entre los ingenieros de software intentando construir mejores y más eficientes programas a prueba de idiotas y el Universo intentando producir mejores y más grandes idiotas. De momento, el Universo está ganando