Нейл уже ответил на ваши вопросы, вот мои комментарии к вашим 3-м и 4-м вопросам.
Распределяет ли следующий код память также для переменной char**
с именем BIG
?
typdef struct myStruct {
char BIG[256][256];
int baz;
} myStruct;
myStruct* foo;
foo = (myStruct*) malloc( sizeof(*foo) );
(я исправил ошибку в типе BIG
.) Это выделит место для BIG
, хотя BIG
не относится к типу char **
. BIG
имеет тип «массив [256] массива [256] из char
». В контексте значений это эквивалентно «указателю на массив [256] из char
».
Как я могу легко привести возвращаемое значение malloc ()? На вопрос № 3 я написал:
foo = (myStruct*) malloc( sizeof(*foo) );
Но я предпочитаю писать что-то вроде:
foo = (foo) malloc( sizeof(*foo) ); // the compiler reports an error
Вы почти правы в том, что хотите сделать, но правильный путь требует еще меньше печатания! Наиболее идиоматичный, удобный для чтения и «безопасный при смене типа» способ:
#include <stdlib.h>
foo = malloc(sizeof *foo);
Или, в более общем смысле,
#include <stdlib.h>
T *foo = malloc(size * sizeof *foo);
Никаких приведений не требуется, так как malloc()
возвращает void *
, который может быть преобразован в любой тип указателя взад и вперед без потери информации. Обратите внимание, что эта форма не использует тип foo
в вызове malloc()
, поэтому она не зависит от типа. Кроме того, оператору sizeof
не нужны круглые скобки, если он используется для объекта (но они нужны, если он используется для типа).