将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运算符只处理buffer
variables。
号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_size
replace你的sizeof
( malloc_usable_size
页指出这是不可移植的,所以可能不适用于你的特定的C实现)。