如何确定分配的C缓冲区的大小?

如何确定分配的C缓冲区的大小?,c,malloc,buffer,buffer-overflow,C,Malloc,Buffer,Buffer Overflow,我有一个缓冲区,想做一个测试,看看缓冲区是否有足够的容量,即找到我可以添加到缓冲区的元素数量 char *buffer = (char *)malloc(sizeof(char) * 10); 做一个 int numElements = sizeof(buffer); 不返回10,有没有关于如何完成此任务的想法?您不能进行这样的测试。记住分配了多少内存是您自己的责任。如果缓冲区是由其他人提供给您的,请要求他们也传递大小信息,并让他们负责传递正确的值或让程序死亡。由于buffer是指针(而不

我有一个缓冲区,想做一个测试,看看缓冲区是否有足够的容量,即找到我可以添加到缓冲区的元素数量

char *buffer = (char *)malloc(sizeof(char) * 10);
做一个

int numElements = sizeof(buffer); 

不返回10,有没有关于如何完成此任务的想法?

您不能进行这样的测试。记住分配了多少内存是您自己的责任。如果缓冲区是由其他人提供给您的,请要求他们也传递大小信息,并让他们负责传递正确的值或让程序死亡。

由于
buffer
是指针(而不是数组),
sizeof
运算符返回指针的大小,而不是它指向的缓冲区的大小。没有标准的方法来确定这个大小,所以你必须自己记账(即记住你分配了多少)

顺便说一句,这对我来说是一样的

 char *p = "hello, world\n"; /* sizeof p is not 13. */
有趣的是

 sizeof "hello, world\n"

她14岁。你能猜出原因吗?

buffer
只是一个没有大小信息的指针。但是,malloc()例程将保留您分配的大小,因此当您释放()它时,它将释放适当的空间量。因此,除非您想深入研究malloc()功能,否则我建议您自己保存分配的大小。(有关可能的实现,请参见其他API答案中的示例)

使用API而不是malloc/free,您就不会出错。

对于GNU glibc:

SYNOPSIS

#include <malloc.h>
size_t malloc_usable_size (void *ptr);
概要
#包括
尺寸(无效*ptr);
描述

函数的作用是:返回ptr指向的块中的可用字节数、指向malloc(3)或相关函数分配的内存块的指针


你真的在向提问者发问吗?这不是我们来这里的真正原因…@Jens我知道sizeof()返回字符串文本和数组的正确大小,但为什么?尺寸信息存储在哪里?例如char*p=“hello”给出了指针的大小,char p[10]给出了10的大小。@Evert我们来这里是为了得到答案,他给出了答案。提出后续问题是一种合法的教育手段。此外,我认为他的问题不值得批评,因为他的问题的答案是他刚才给出的答案,所以他并没有真正隐藏信息。我想人们可能会对留下“读者练习”的功效或价值等进行辩论,但在这种情况下,它是相当简洁和相关的。@WilburWhateley任何好事都会受到惩罚。我的答案甚至被否决了。任何人在思考后续问题时,都可能会对字符串文字和字符串有一个深刻的认识,这是在指导学习者进行自我发现的久经考验的教育风格中提出的。实际上,我在这里上了一堂重要的课——C字符串常量是字符数组,而不是指向任意大小缓冲区的指针。这是一个很好且重要的观点。如果你真的想变得聪明,你可以编写自己的
malloc
,使用系统
malloc
分配四个额外字节,将分配的长度存储在那里,并在该长度后返回一个指针。然后,您可以有一个
getSize
方法,该方法使用指针算法再次获取该值。它允许您使用类似于
malloc
free
的调用。我不确定这是否明智——这意味着您个人的malloc现在对其他人的行为有所不同。我认为调整核心函数行为是有风险的。我认识一家公司,它超越了malloc,所以它分配的所有东西都进入了自由列表,而free只是将元素返回到自由列表。令人震惊的是,无论是它的功能,还是它的实际实现方式(考虑到这个想法有多么糟糕,这并不奇怪),它深深地嵌入到代码中,永远无法删除。我喜欢这样,因为它隐藏了这样一个事实,即malloc/calloc并没有真正记录您要求它们分配的内容。这些方法将为您分配足够的资源—有时比您要求的资源分配多一点,并且与您要求的资源分配方式不同,但不会记住您要求的原始元素数量。最好有我们自己的缓冲区定义,包括它的开始指针和长度(在元素中)。注意:这可能会导致严重的开销,因为它依赖于malloc实现。它返回分配的字节。要获得可用元素的数量,您需要一个额外的分区。该男子清楚地说:“malloc_可用_大小()返回的值由于对齐和最小大小限制,可能大于请求的分配大小。虽然应用程序可以覆盖多余的字节而不会产生不良影响,但这不是良好的编程实践:分配中多余字节的数量取决于基础实现。”您如何确定他们是否传递了正确的值?@user124384:您不能。相反,您记录了图书馆的要求,阅读、理解和遵守合同是您的用户的责任。你对此不负责任。动态内存调试器(如Valgrind或ASAN)可以帮助验证单个程序,但C语言不能。您还可以将库隐藏在一些不透明的抽象边界后面,并在幕后执行所有分配和解除分配,这样用户只需传递不透明句柄。(但这将是另一个问题的答案!)可能重复的,相关的是
SYNOPSIS

#include <malloc.h>
size_t malloc_usable_size (void *ptr);