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

ant*_*009 8 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));
Run Code Online (Sandbox Code Playgroud)

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

非常感谢任何建议,

Pét*_*rök 16

你要的是a的大小char*确实是4,而不是缓冲区的大小.该sizeof运营商不能返回一个动态分配的缓冲区的大小,只有在编译时已知的静态类型和结构的大小.

  • @robUK - 使用`struct {char*buf;自己跟踪它.size_t len; };`.或者使用别人的字符串库.或者严格遵守"始终通过缓冲区长度"规则(无论如何你应该这样做). (3认同)
  • `sizeof`可以在C99中为可变长度数组返回动态缓冲区的大小. (2认同)
  • @Carl - VLA不是动态的.它们是"可变长度",因为它们的长度可以在运行时计算,但不是"可变长度",因为它们的长度可以改变.它们仍然是基于堆栈的数组,这就是定义`sizeof`为它们工作的原因. (2认同)

Car*_*rum 9

sizeof不适用于动态分配(在C99中有一些例外).你在sizeof这里的使用只是给你指针的大小.此代码将为您提供所需的结果:

char buffer[10240];
printf("sizeof(buffer) [ %d ]\n", sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)

如果malloc()成功,指向的内存至少与您要求的一样大,因此没有理由关心它分配的实际大小.

此外,您已经分配了10 kB,而不是1 kB.

  • @Anon - 它并不危险,它只是以不同的方式解决问题.OP没有关于从函数传回缓冲区的要求. (2认同)