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...
+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
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
Dziękuję ludziom! – sabergeek