1)
¿Para qué tipos de datos debo asignar memoria con malloc?¿Cuándo debo usar malloc para asignar memoria?
- Para tipos como estructuras, punteros, excepto los tipos de datos básicos, como int
- Para todos los tipos?
2)
qué puedo ejecutar este código? ¿Por qué no se cuelga? Supuse que primero debía asignar memoria para la estructura.
#include <stdio.h>
#include <stdlib.h>
typedef unsigned int uint32;
typedef struct
{
int a;
uint32* b;
}
foo;
int main(int argc, char* argv[])
{
foo foo2;
foo2.a = 3;
foo2.b = (uint32*)malloc(sizeof(uint32));
*foo2.b = 123;
}
¿No sería mejor usar
foo* foo2 = malloc(sizeof(foo));
3) Cómo es foo.b establecido? ¿Es la memoria aleatoria de referencia o NULL?
#include <stdio.h>
#include <stdlib.h>
typedef unsigned int uint32;
typedef struct
{
int a;
uint32* b;
}
foo;
int main(int argc, char* argv[])
{
foo foo2;
foo2.a = 3;
}
+1: C99 permite el uso de asignación de pila para estructuras de longitud variable (bueno, matrices, pero eso es suficiente para hacer todo). Pero no lo recomiendo para nada significativo de todos modos; en la práctica, la pila tiende a ser * mucho * más pequeña que la pila. (También trabajo mucho con código donde la duración de la estructura de datos no coincide con la vida útil de la estructura de pila). –
+1 y +1. Se puede mitigar el requisito del alcance de exo función elevando malloc() hasta la función de llamada, y no forzando a malloc() a llamarse millones de veces en lugar de una vez, Y esto a menudo también es una gran mejora en el rendimiento. Esto se puede hacer, y normalmente debería hacerse, incluso si la persona que llama desconoce el tamaño, donde la función llama a realloc() si la memoria es insuficiente. Digo esto porque la persona que llama necesita el puntero a la memoria libre() una vez que el ciclo ha terminado de llamar a su función. SIEMPRE malloc()/calloc() y free() en el mismo ámbito. ¡SIEMPRE! – RocketRoy