Предположим, у меня есть простая структура, включающая несколько указателей:
typedef struct Type {
uint32_t* intArrayPointer;
} Type;
Как правильно выделить указатель структуры? Поскольку оба способа работают, я предполагаю, что один из двух выделяет больше памяти, чем необходимо:
Type* newType() {
Type* returnPointer = malloc(sizeof(Type));
returnPointer->intArrayPointer = malloc(sizeof(uint32_t)*128);
return returnPointer;
}
Type* newType() {
Type* returnPointer = malloc(sizeof(Type*));
returnPointer->intArrayPointer = malloc(sizeof(uint32_t)*128);
return returnPointer;
}
Для справки, как это будет использоваться в коде:
void freeType(Type* this) {
free(this->intArrayPointer);
free(this);
}
int main() {
Type* pt = newType();
//do Stuff
freeType(pt);
}
Лучшим способом было бы использовать
Type* returnPointer = malloc(sizeof(*returnPointer));
или лучше,
Type* returnPointer = malloc(sizeof *returnPointer);
// parenthesis is needed only when argument is a type,
// not needed for expressions used as argument
который вообще не зависит от типа.
Точно так же вы должны сделать и для intArrayPointer
. И не забудьте также проверить успешность вызовов.
С помощью intArrayPointer
я действительно хочу зарезервировать 512 смежных байтов с указателем, указывающим на первый.
@WhozCraig очень актуален, позвольте мне добавить это.
@FrankPirata Все в порядке, я говорю только о синтаксисе.
Минор: sizeof *returnPointer
с пробелом меньше похоже на умножение, чем sizeof*returnPointer
.
sizeof(Type*)
может быть больше, меньше или равноsizeof(Type)
. Важным моментом является то, что это неправильно.