¿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

valido para asignar eso astruct 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!

Respuestas a la pregunta(8)

Su respuesta a la pregunta