¿Son “malloc (sizeof (struct a *))” y “malloc (sizeof (struct a))” lo mismo?
Esta pregunta es una continuación deMalloc se bloquea, pero funciona en otro lugar
Probé el siguiente programa y lo encontré funcionando (es decir, no se bloquea, y esto también se mencionó en el enlace mencionado anteriormente). ¡Puedo tener suerte de que funcione, pero estoy buscando una explicación razonable de parte de los expertos de SO sobre por qué esto funciona?!
quí hay algunos conocimientos básicos sobre la asignación dememory
utilizandomalloc()
w.r.tstructures
ypointers
malloc(sizeof(struct a) * n)
asignan
número de tipostruct a
elementos. Y, esta ubicación de memoria se puede almacenar y acceder usando unapointer-to-type-"struct a"
. Básicamente unastruct a *
.malloc(sizeof(struct a *) * n)
asignan
número de tipostruct a *
elementos. Cada elemento puede apuntar a elementos de tipostruct a
. Básicamentemalloc(sizeof(struct a *) * n)
asigna unarray(n-elements)-of-pointers-to-type-"struct a"
. Y, la ubicación de memoria asignada se puede almacenar y acceder usando unapointer-to-(pointer-to-"struct a")
. Básicamente unastruct a **
. Entonces cuando creamos unarray(n-elements)-of-pointers-to-type-"struct a"
, Lo e
struct a *
en lugar destruct a **
?valid para acceder / desreferenciar el @ asignaarray(n-elements)-of-pointers-to-type-"struct a"
utilizandopointer-to-"struct a"
?data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
El fragmento de código es el siguiente:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
typedef struct {
int value1;
int value2;
}data;
int n = 1000;
int i;
int val=0;
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
printf("allocation successful\n");
for (i=0 ; i<n ; i++) {
array[i].value1 = val++;
array[i].value2 = val++;
}
for (i=0 ; i<n ; i++) {
printf("%3d %3d %3d\n", i, array[i].value1, array[i].value2);
}
free(array);
printf("freeing successful\n");
return 0;
}
EDIT: OK decir si hago lo siguiente porErro
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
Hay una manera de capturar (durante el tiempo de compilación usando cualquierGCC
flags) este tipo de errores de programación involuntarios que podrían funcionar a veces y pueden explotar en cualquier momento. Compilé esto usando-Wall
y no encontré advertencias!