продолжение сбоя вызова 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"
,
struct a *
вместо struct a **
? (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
и не обнаружил никаких предупреждений!