2013-03-05 10 views

Odpowiedz

37

malloc(sizeof(int)) oznacza, że ​​przeznaczają miejsca off hałdy do przechowywania int. Rezerwujesz tyle bajtów, ile wymaga ich int. Powoduje to zwrócenie wartości, którą należy odrzucić do int *. (Wskaźnik do int.) Jak niektórzy zauważyli, typową praktyką w C jest umożliwienie tego domyślnego rzucania.

malloc(sizeof(int*)) oznacza, że ​​przydzielasz przestrzeń poza stertą, aby przechowywać wskaźnik na int. Rezerwujesz tyle bajtów, ile wymaga wskaźnik. Zwraca wartość, którą należy odrzucić do int **. (A wskaźnik do wskaźnika do int.)

(int *)malloc(sizeof(int)) jest dokładnie taka sama jak pierwszego, ale z wynikiem wyraźnie lanego do wskaźnika do int.

Należy zauważyć, że na wielu architekturach, int ma taki sam rozmiar jak wskaźnik, więc będą się wydawać (niepoprawnie) tym samym. Innymi słowy, możesz przypadkowo zrobić niewłaściwą rzecz i mieć wynikowy kod nadal działa.

+1

+1 do ostatniego akapitu - jednak z mojego doświadczenia, wiele C programiści "celowo" robią coś niewłaściwego i to działa, więc robią to dalej ..... – mattnz

+4

RE pierwszy akapit: W C wiele osób twierdzi, że nie powinno się go używać (jest niejawna konwersja) od 'void *' do dowolnego typu wskaźnika w C, więc działa). Zobacz http://stackoverflow.com/q/605845/395760 – delnan

+0

Dziękuję ludziom! – sabergeek

4

Wzór składni, który jest najbardziej niezawodny jest:

int *p; 
p = malloc (cnt * sizeof *p); 

Ta składnia nie zmusi Cię do zmiany kodu, jeśli typ (i czy rozmiar ...) z * p zmian, na przykład w

struct mysstruct *q; 
q = malloc (cnt * sizeof *q); 

co pozwoli uniknąć problemów, takich jak

struct mysstruct *z; 
z = malloc (cnt * sizeof(struct hisstruct)); // Auch! 

oraz: forma sizeof expr jest również s horter.


UPDATE: w celu wykazania prawidłowości p = malloc(CNT * sizeof *p) program testowy:

#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; 
} 

które wyjścia tutaj:

Sizeof p := 8 
Sizeof *p := 20 
Allocating 200 (10 structs, each of size 20) bytes to be assigned to p... 
+0

Wzór nie jest "malloc (cnt * sizeof * p)", ale zgodnie z przyjętą odpowiedzą odpowiednio zanotowano 'sizeof p'. To samo dla q/* q. W przeciwnym razie musisz 'int ** p', aby poprawnie zatrzymać wynik. – EntangledLoops

+1

Nie rozumiem twojego pytania. 'Wpisz * t; t = malloc (CNT * sizeof * t); 'jest ** zawsze ** w porządku, inne warianty są * czasami * prawidłowe. – wildplasser

+0

To nie było pytanie i * nie *, to nie zawsze jest w porządku. Zakładasz, że 'sizeof * t' =' sizeof t', co niekoniecznie jest prawdą. Twoja linia powinna poprawnie czytać: 'Type * t; t = malloc (CNT * sizeof t); ' – EntangledLoops