2013-03-05 4 views
17

Я признаю, что все три из них имеют другое значение. Но я не понимаю, какие конкретные примеры применимы к каждому из них. Может ли кто-нибудь поделиться примером для каждого из них? Спасибо.malloc (sizeof (int)) vs malloc (sizeof (int *)) vs (int *) malloc (sizeof (int))

 malloc(sizeof(int)) 
     malloc(sizeof(int *)) 
(int *)malloc(sizeof(int)) 

ответ

37

malloc(sizeof(int)) означает, что вы выделить пространство от кучи для хранения int. Вы резервируете столько байтов, сколько требуется int. Это возвращает значение, которое вы должны наложить на int *. (Указатель на int.) Как уже отмечалось, типичная практика в C заключается в том, чтобы позволить неявное кастинг заботиться об этом.

malloc(sizeof(int*)) означает, что вы выделяете пространство из кучи для хранения указателя на int. Вы резервируете столько байтов, сколько требуется указателю. Это возвращает значение, которое вы должны наложить на int **. (Указатель на указатель на int.)

(int *)malloc(sizeof(int)) точно так же, как и при первом вызове, но с результатом явно отливают на указатель на int.

Обратите внимание, что на многих архитектурах int имеет такой же размер, как указатель, поэтому они будут казаться (неправильно) одинаковыми. Другими словами, вы можете случайно сделать неправильную вещь и получить полученный код все еще.

+1

+1 за последний абзац - однако в моем опыте, многие C программисты «намеренно» делают неправильную вещь, и это работает, поэтому они продолжают делать это ..... – mattnz

+4

RE первый абзац: В C многие люди утверждают, что вы не должны бросать его (есть неявные конверсии от 'void *' до любого типа указателя в C, поэтому он работает). См. Http://stackoverflow.com/q/605845/395760 – delnan

+0

Спасибо людям! – sabergeek

4

Узор синтаксис, который является наиболее надежной является:

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 форма также S horter.


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

Шаблон не 'malloc (cnt * sizeof * p)', но, как правильно принят принятый ответ, 'sizeof p'. То же самое для q/* q. В противном случае вам нужно 'int ** p' правильно удерживать результат. – EntangledLoops

+1

Я не понимаю ваш вопрос. 'Тип * t; t = malloc (CNT * sizeof * t); 'всегда ** ** справа, другие варианты * иногда * справа. – wildplasser

+0

Это был не вопрос и * нет *, это не всегда правильно. Вы предполагаете, что 'sizeof * t' =' sizeof t', что не обязательно верно. Ваша строка должна правильно читать: 'Type * t; t = malloc (CNT * sizeof t); ' – EntangledLoops

Смежные вопросы