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

god*_*lla 10 c malloc buffer buffer-overflow

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

char *buffer = (char *)malloc(sizeof(char) * 10);
Run Code Online (Sandbox Code Playgroud)

做一个

int numElements = sizeof(buffer); 
Run Code Online (Sandbox Code Playgroud)

不回10,有关如何实现这一点的任何想法?

小智 24

对于GNU glibc:

SYNOPSIS

#include <malloc.h>
size_t malloc_usable_size (void *ptr);
Run Code Online (Sandbox Code Playgroud)

描述

malloc_usable_size()函数返回ptr指向的块中的可用字节数,指向malloc(3)或相关函数分配的内存块的指针.


Ker*_* SB 14

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

  • 如何确定它们是否传递了正确的值? (2认同)
  • @user124384:你不能。相反,您记录图书馆的要求,并且您的用户有责任阅读、理解和遵守合同。你对此不负有责任。动态内存调试器(如 Valgrind 或 ASAN)可以帮助验证单个程序,但 C 却不能。您还可以将库隐藏在一些不透明的抽象边界后面,并在幕后进行所有分配和释放,这样用户只能传递不透明的句柄。(但这将是另一个问题的答案!) (2认同)

Jen*_*ens 7

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

顺便说一句,它是一样的

 char *p = "hello, world\n"; /* sizeof p is not 13. */
Run Code Online (Sandbox Code Playgroud)

有趣的是,

 sizeof "hello, world\n"
Run Code Online (Sandbox Code Playgroud)

是14.你能猜到为什么吗?

  • 你真的在提问者面前回答问题吗?那不是我们在这里的原因...... (17认同)
  • @Evert我们在这里得到答案,他给了答案。提出后续问题是一种合法的教育手段。此外,我认为他的问题不值得批评,因为他的问题的答案就是他刚刚给出的答案,因此他并没有真正隐藏信息。我想可以争论一下“给读者一种锻炼”的功效或价值,但是在这种情况下,它非常简洁和相关。 (2认同)
  • @WilburWhateley没有好事不受惩罚.我的回答甚至被低估了.任何想到后续问题的人,都是经过时间考验的教育方式,引导学习者进行自我发现,可能会对字符串文字和字符串有所了解. (2认同)

Eve*_*ert 6

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