Узор синтаксис, который является наиболее надежной является:
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...
+1 за последний абзац - однако в моем опыте, многие C программисты «намеренно» делают неправильную вещь, и это работает, поэтому они продолжают делать это ..... – mattnz
RE первый абзац: В C многие люди утверждают, что вы не должны бросать его (есть неявные конверсии от 'void *' до любого типа указателя в C, поэтому он работает). См. Http://stackoverflow.com/q/605845/395760 – delnan
Спасибо людям! – sabergeek