[C con Clase] QUE PASA EN LAS ENTRAÑAS DEL "STRCPY"

Mariano Demarchi marchi.hh en gmail.com
Sab Jun 20 07:21:00 CEST 2009


Programante escribió:
>Tal vez la cadena no sea lo bastante larga. O estás desbordando otra
>zona de memoria.
>Si está reservada en el montón, tendrás al menos una página
>(habitualmente 4096 bytes)
>de espacio reservado para el proceso. Después puede que haya más espacio
>reservado
>para el programa (por ejemplo variables del entorno) y siga
>sobreescribiendo alegremente
>hasta que se acaba la cadena.
Cuando se hace una llamada a malloc(), la memoria se reserva en el heap que
es una porcion de memoria libre con este proposito, el alojamiento dinamico.
Yo no se como funciona internamente malloc, esto depende de que algoritmo se
ha usado lo cual puede cambiar de version en version de la libreria, pero
hice algunas pruebas y siempre que hice (malloc(sizeof(int)*k),
con k={1..6}, en sucesivas llamadas las posiciones de los bloques reservados
difieren 32 bytes,
con k={7..10}, en sucesivas llamadas las posiciones de los bloques
reservados difieren 48 bytes,
con k={11..}, en sucesivas llamadas las posiciones de los bloques reservados
difieren 64 bytes
hay que tener en cuenta que tengo ints de 4 bytes.
Por otro lado cuando hago (malloc(sizeof(char)), se reservan cada 32 bytes
tambien.
Entonces aparentemente malloc siempre reserva un minimo de 32 bytes, mas
halla de que no se usen, o quizas solo se trata de una simple alineacion de
palabras. El hecho es que para tener un segmentation fault deberias escribir
bastante. Ya que si intentas escribir sobre otras posiciones que hubieras
reservado consecutivamente con malloc, no te podria dar error alguno.
Tambien hice otra prueba en la que reservo un char con malloc y luego
escribo indefinidamente chars hasta que obtengo "Violacion de segmento" en
el desplazamiento 135152, se trata del mismo numero siempre. Me parece raro
por que no parece un "numero de tamaño de algo", me refiero a que no es
potencia de 2 ni parecido, pero bueno... el caso es que si tira error.
Por cierto Pedro por "desbordamiento del monton" a que te refieres?,
desbordamiento del heap?
Si no fuera esto, mas facil e interesante seria:
int main()
{
char a[1],i=0;
while(i<10){
a[i++] = 0;
}
}
Este bucle no termina nunca, ya que como i esta definida justo despues de a,
cuando se escribe fuera de a lo primero que pone a 0 es la misma i. (siempre
y cuando el compilador no haga de las suyas)
Saludos
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090620/077857ed/attachment.html>


Más información sobre la lista de distribución Cconclase