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(缓冲区)总是打印4.我知道char *只有4个字节。但是,我已经分配了10kb的内存。那么尺寸不应该是10240吗?我想知道我在想什么?
非常感谢任何建议,
答案 0 :(得分:15)
您要求char*
的大小确实是4,而不是缓冲区的大小。 sizeof
运算符不能返回动态分配的缓冲区的大小,只能返回编译时已知的静态类型和结构的大小。
答案 1 :(得分:9)
sizeof
不适用于动态分配(在C99中有一些例外)。你在这里使用sizeof
只是给你指针的大小。此代码将为您提供所需的结果:
char buffer[10240];
printf("sizeof(buffer) [ %d ]\n", sizeof(buffer));
如果malloc()
成功,指向的内存至少与您要求的内容一样大,因此没有理由关心它分配的实际大小。
此外,您已经分配了10 kB,而不是1 kB。
答案 2 :(得分:3)
如果需要,可以跟踪内存大小。 malloc返回的内存只是指向“未初始化”数据的指针。 sizeof运算符仅适用于buffer
变量。
答案 3 :(得分:3)
没有。 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
将在上面的代码中改变,这对编译时常量没有意义。
答案 4 :(得分:2)
将sizeof
替换为malloc_usable_size
(联机帮助页表明这是不可移植的,因此您的特定C实现可能无法使用。)