malloc (sizeof (int)) vs malloc (sizeof (int *)) vs (int *) malloc (sizeof (int))
Я признаю, что все три из них имеют другое значение. Но я не понимаю, какие конкретные примеры применимы к каждому из них. Может ли кто-нибудь поделиться примером для каждого из них? Спасибо.
malloc(sizeof(int))
malloc(sizeof(int *))
(int *)malloc(sizeof(int))
Ответы
Ответ 1
malloc(sizeof(int))
означает, что вы выделяете пространство из кучи для хранения int
. Вы резервируете столько байтов, сколько требует int
. Это возвращает значение, которое вы должны использовать для int *
. (Указатель на int
.) Как некоторые отметили, типичная практика в C заключается в том, чтобы позволить неявное кастинг заботиться об этом.
malloc(sizeof(int*))
означает, что вы выделяете пространство из кучи для хранения указателя на int
. Вы резервируете столько байтов, сколько требуется указателю. Это возвращает значение, которое вы должны использовать для int **
. (Указатель на указатель на int
.)
(int *)malloc(sizeof(int))
является точно таким же, как и первый вызов, но с результатом, явно введенным в указатель на int
.
Обратите внимание, что во многих архитектурах int
имеет тот же размер, что и указатель, поэтому они кажутся (неправильно) одинаковыми. Другими словами, вы можете случайно сделать неправильную вещь и получить полученный код все еще.
Ответ 2
Наиболее сильным является синтаксический шаблон:
int *p;
p = malloc (cnt * sizeof *p);
Этот синтаксис не заставит вас изменить код, если изменяется тип (и или размер...) * *, например, в
struct mysstruct *q;
q = malloc (cnt * sizeof *q);
Который позволит избежать таких проблем, как
struct mysstruct *z;
z = malloc (cnt * sizeof(struct hisstruct)); // Auch!
плюс: форма sizeof expr
также короче.
UPDATE: чтобы продемонстрировать правильность p = malloc(CNT * sizeof *p)
эта тестовая программа:
#include <stdio.h>
#include <stdlib.h>
struct mystruct {
int i;
char s[14];
};
int main(void)
{
struct mystruct *p;
size_t siz;
siz = sizeof p;
printf("Sizeof p := %zu\n", siz);
siz = sizeof *p;
printf("Sizeof *p := %zu\n", siz);
printf("Allocating %zu (%u structs, each of size %zu) bytes to be assigned to p...\n"
, 10u * sizeof *p
, 10u, sizeof *p
);
p = malloc(10 * sizeof *p);
return 0;
}
Какие результаты здесь:
Sizeof p := 8
Sizeof *p := 20
Allocating 200 (10 structs, each of size 20) bytes to be assigned to p...