将sizeof与dynamic分配的数组一起使用

gcc 4.4.1 c89

我有以下代码片段:

#include <stdlib.h> #include <stdio.h> char *buffer = malloc(10240); /* Check for memory error */ if(!buffer) { fprintf(stderr, "Memory error\n"); return 1; } printf("sizeof(buffer) [ %d ]\n", sizeof(buffer)); 

但是,sizeof(buffer)总是打印4.我知道char *只有4个字节。 但是,我已经分配了10kb的内存。 所以不应该是10240? 我想知道我在想什么吗?

非常感谢您的任何build议,

你要求的char*的大小确实是4,而不是缓冲区的大小。 sizeof运算符不能返回dynamic分配的缓冲区的大小,只能返回编译时已知的静态types和结构的大小。

sizeof不适用于dynamic分配(在C99中有一些例外)。 你在这里使用sizeof只是给你指针的大小。 这段代码会给你你想要的结果:

 char buffer[10240]; printf("sizeof(buffer) [ %d ]\n", sizeof(buffer)); 

如果malloc()成功,指向的内存至less与你所要求的一样大,所以没有理由关心它分配的实际大小。

另外,您已经分配了10 kB,而不是1 kB。

如果你需要的话,你可以跟踪内存的大小。 malloc返回的内存只是指向“未初始化”数据的指针。 sizeof运算符只处理buffervariables。

buffer是一个char * 。 这是一个指向char数据的指针。 指针只占用4个字节(在你的系统上)。

它指向10240字节的数据(顺便说一下,不是1Kb,更像是10Kb),但指针不知道 。 考虑:

 int a1[3] = {0, 1, 2}; int a2[5] = {0, 1, 2, 3, 4}; int *p = a1; // sizeof a1 == 12 (3 * sizeof(int)) // but sizeof p == 4 p = a2 // sizeof a2 == 20 // sizeof p still == 4 

这是数组和指针的主要区别。 如果不这样工作, sizeof p会改变上面的代码,这对于编译时常量是没有意义的。

malloc_usable_sizereplace你的sizeofmalloc_usable_size页指出这是不可移植的,所以可能不适用于你的特定的C实现)。