Этот вопрос является продолжением Malloc call crashing, but works elsewhere«malloc (sizeof (struct a *))» и «malloc (sizeof (struct a))« то же самое?
Я попробовал следующую программу, и я нашел, что это работает (т.е. не врезаться - и это было упомянуто в вышеуказанной ссылке тоже). Мне может быть повезло, что он работает, но я ищу разумное объяснение экспертов SO о том, почему это работает ?!
Вот некоторые базовые знания о выделении memory
использования malloc()
w.r.t structures
и pointers
malloc(sizeof(struct a) * n)
выделяетn
числа типаstruct a
элементов. И эту ячейку памяти можно сохранить и получить, используяpointer-to-type-"struct a"
. В основномstruct a *
.malloc(sizeof(struct a *) * n)
n
кол-во типовstruct a *
элементов. Каждый элемент затем может указывать на элементы типаstruct a
. В основномmalloc(sizeof(struct a *) * n)
выделяетarray(n-elements)-of-pointers-to-type-"struct a"
. И выделенное место памяти может быть сохранено и доступно с помощьюpointer-to-(pointer-to-"struct a")
. В основномstruct a **
.
Так что, когда мы создаем array(n-elements)-of-pointers-to-type-"struct a"
, это
- действительны для назначения, что
struct a *
вместоstruct a **
? - действительный для доступа/отмены ссылки
array(n-elements)-of-pointers-to-type-"struct a"
с использованиемpointer-to-"struct a"
?
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
фрагмент кода выглядит следующим образом:
#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 сказать, если я следующий по ошибке
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
Есть ли способ захвата (во время компиляции с использованием любых флагов GCC
) такого рода непреднамеренные опечатки программирования, которые могли бы работать время от времени и могли бы взорваться в любое время! Я скомпилировал это с помощью -Wall
и не нашел никаких предупреждений!
Вашего вопрос название, кажется, не соответствуют актуальным вопросам в остальной части текста выше ... –
Кроме того, почему вы хотите назначить результат «malloc» не по той причине, а затем разыменовать его? Я не понимаю предпосылку вопросов. –
@ OliCharlesworth Я делаю это по ошибке и не намеренно! так что разве программа не может упасть, когда я это сделаю ?! –