当malloc时我应该使用sizeof作为sizeof的参数

时间:2017-09-15 08:35:53

标签: c

当malloc

时,我总是混淆sizeof内的内容

例如,

struct sth *p = malloc(sizeof(struct sth *));

char ***p = malloc(sizeof(WHAT_SHOULD_I_PUT_HERE));

或,struct sth *p = malloc(sizeof(*p)); ???

有一天,一些c大师告诉我使用这样的变量:

void main() { int n = 1000000, i; char **p = malloc(sizeof(char *) * n); // works //char **p = malloc(sizeof(**p) * n); // not work, segfault for(i=0; i<n; i++) { // p[i] = malloc(sizeof(char)); // works // p[i] = malloc(sizeof(p[i])); // works // p[i] = malloc(sizeof(*p[i])); // works } for(i=0; i<n; i++) { free(p[i]); } free(p); }

所以我写了一些代码:

channel.pipeline().addLast(new ReadTimeoutHandler(readTimeout));

仍然感到困惑,还有任何简单的记忆方法吗?

3 个答案:

答案 0 :(得分:4)

sizeof(struct sth)是你的struct在内存中占用的大小。

sizeof(struct sth*)指针struct sth的大小(通常为4或8个字节);实际上它是你平台上任何指针的大小。

所以你需要:

struct sth *p = malloc(sizeof(struct sth));

但最好写一下:

struct sth *p = malloc(sizeof(*p));

sizeof(*p);p指向的对象的大小,而p指向struct sthsizeof(*p)sizeof(struct sth)相同}。

答案 1 :(得分:1)

当您编写CamlQuery时,C编译器会计算您给它的实际大小。例如,当您键入sizeof时,您要求编译器计算... 指针的大小!这是4或8个字节(分别为32,64位),具体取决于您的机器架构。

但是,如果键入sizeof (*int),它将返回类型为sizeof (struct foo)的结构在内存中占用的字节数。

在某些时候,您需要为结构及其值创建足够的内存。所以通常你想把foo传递给malloc。

答案 2 :(得分:1)

如果您想使用*p规则,则在下面的情况中您需要执行

char **p = malloc(sizeof(*p) * n);

即使你有char ***p,你仍然会使用

char ***p = malloc(sizeof(*p) * n);