当malloc
时,我总是混淆sizeof内的内容例如,
struct sth *p = malloc(sizeof(struct sth *));
或
char ***p = malloc(sizeof(WHAT_SHOULD_I_PUT_HERE));
或,struct sth *p = malloc(sizeof(*p));
???
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));
仍然感到困惑,还有任何简单的记忆方法吗?
答案 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 sth
,sizeof(*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);