Являются ли «malloc (sizeof (struct a *))» и «malloc (sizeof (struct a))» то же самое?

продолжение сбоя вызова Malloc, но работает в другом месте

Я попробовал следующую программу и обнаружил, что она работает (т.е. не дает сбоев - и об этом тоже упоминалось в вышеупомянутой ссылке). работает, но я ищу разумное объяснение от экспертов SO относительно того, почему это работает ?!

Вот некоторые базовые представления о распределении памяти с использованием malloc () по структурам и указателям

  • malloc (sizeof (struct a) * n) выделяет n номер типа struct a элементы. И эта ячейка памяти может быть сохранена и доступна с помощью указателя на тип - «структура» . В основном это структура * .
  • malloc (sizeof (struct a *) * n) выделяет n количество элементов типа struct a * . Затем каждый элемент может указывать на элементы типа struct a .В основном malloc (sizeof (struct a *) * n) выделяет массив (n-элементов) -of-указателей-на-тип- «struct a» . И выделенная ячейка памяти может быть сохранена и доступна с помощью указателя на (указатель на «структуру») . Обычно это структура ** .

Итак, когда мы создаем массив (n-элементов) -of-pointer-to-type- "struct a" ,

  1. допустимо ли присвоить это struct a * вместо struct a ** ?
  2. допустимо для доступа / отмены ссылки на выделенный массив (n-elements) -of-pointer-to-type- «struct a» с использованием указателя на «структуру» ?

data * array = NULL;

if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
    printf("unable to allocate memory \n");
    return -1; 
}   

Фрагмент кода выглядит следующим образом:

#include 
#include 

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

РЕДАКТИРОВАТЬ: Хорошо, скажите, если я сделаю следующее с помощью ошибки

data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {

Есть ли способ зафиксировать (во время компиляции с использованием любых GCC флагов) такого рода непреднамеренные опечатки в программировании, которые могут работать время от времени и могут взорвать в любое время! Я скомпилировал это с помощью -Wall и не обнаружил никаких предупреждений!

5
задан Community 23 May 2017 в 12:13
поделиться