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

时间:2010-04-28 16:51:34

标签: c sizeof

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吗?我想知道我在想什么?

非常感谢任何建议,

5 个答案:

答案 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)

没有。 bufferchar *。它是指向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实现可能无法使用。)