¿Duda sobre malloc en C?

Iniciado por D4P50N, 19 Noviembre 2012, 22:23 PM

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

D4P50N

Hola que tal, pues bueno actualmente no tengo ningún error en mi código usando malloc, sin embargo tengo una duda:
:huh:
cuando utilizo esto:
char *MessageToSend;
MessageToSend=(char *)malloc(1 * sizeof(char);

porque al usar lo siguiente:

MessageToSend[0]="1";
MessageToSend[1]="1";
MessageToSend[2]="\0";

no me tirar error de que estoy desbordando el arreglo dinámico?

si lo hicieramos como si fuera un array estatico si tiraria el error, además tengo la duda de que si estoy reservando direcciones de memoria o estoy reservando posiciones de memoria, en este caso es de tipo char.

Espero haberme dado a entender.
****************************************************
Hola creo encontre la solución en este post:
http://www.foro.lospillaos.es/viewtopic.php?p=10767



Citar
Mariano Demarchi escribió:
> 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 haya de que no se usen, o quizas solo se trata de una simple
> alineacion de palabras.
malloc() suele tener un tamaño mínimo de reserva por cuestiones de
implementación.
A lo que yo me refería era al espacio que le da el sistema.

Le pides un byte a malloc()
-Malloc decide que te va a dar 32
Malloc pide al SO una página de memoria
-El SO da una página de memoria a tu programa
Malloc separa 32 bytes y te los da a ti.

Simplemente escribiendo el array sólo obtendrás un fallo de segmentación
cuando te salgas de la página que te dio el SO.
Tendrás resultados incorrectos si cambias más allá de lo que te asignó
malloc (modificas otras variables reservadas dinámicamente, o la
estructura interna de la
reserva de memoria, que puede dar violaciones de segmento en free() por
ejemplo).

Es incorrecto escribir más de un byte en esa memoria (pues es lo único
que malloc() te garantiza "tuyo").


¿Alguien podria confirmarme si posiblemente haya encontrado mi respuesta?

rir3760

Es correcto, al reservar memoria mediante esa función solo debes utilizar el numero de bytes indicados en la llamada.

Otro detalle (tal vez solo un error ortográfico) es utilizar comillas dobles en las asignaciones, por ejemplo:
MessageToSend[0] = "1";
Ya que la literal "1" resulta en la dirección en memoria donde se almacena (de tipo "char *") mientras que "MessageToSend[0]" es de tipo "char".

De nuevo tal vez sea solo un "error de dedazo" y en tu programa utilizas comillas simples para indicar (de la forma correcta) los caracteres '1', '1' y '\0'.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

D4P50N

Si es un error ortográfico muy feo, pero gracias por la explicación de las dobles comillas también tenia duda. Bueno pues lo marcare como resuelto, fue de gran ayuda tu respuesta. ;D