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...