我有一个缓冲区,想测试一下缓冲区是否有足够的容量,即找到可以添加到缓冲区的元素数量。
char *buffer = (char *)malloc(sizeof(char) * 10);
做一个
int numElements = sizeof(buffer);
不返回 10,关于我如何实现这一点的任何想法?
我有一个缓冲区,想测试一下缓冲区是否有足够的容量,即找到可以添加到缓冲区的元素数量。
char *buffer = (char *)malloc(sizeof(char) * 10);
做一个
int numElements = sizeof(buffer);
不返回 10,关于我如何实现这一点的任何想法?
对于 GNU glibc:
SYNOPSIS
#include <malloc.h>
size_t malloc_usable_size (void *ptr);
描述
malloc_usable_size() 函数返回 ptr 指向的块中的可用字节数,指向 malloc(3) 或相关函数分配的内存块的指针。
你不能做这样的测试。记住分配了多少内存是您自己的责任。如果缓冲区是由其他人给你的,要求他们也传递大小信息,并让他们有责任传递正确的值或让程序死掉。
buffer
只是一个没有大小信息的指针。但是 malloc() 例程将保存您所做的分配的大小,因此当您 free() 它时,它会释放适量的空间。因此,除非您想深入了解 malloc() 功能,否则我建议您自己保存分配的大小。(有关可能的实现,请参阅其他 API 答案中的示例)。
由于buffer
是指针(不是数组),因此sizeof
运算符返回指针的大小,而不是它指向的缓冲区的大小。没有标准的方法来确定这个大小,所以你必须自己记账(即记住你分配了多少。)
顺便说一句,对于
char *p = "hello, world\n"; /* sizeof p is not 13. */
有趣的是,
sizeof "hello, world\n"
是 14。你能猜到为什么吗?
struct buffer
{
void
*memory
size_t
length;
};
void *buffer_allocate( struct buffer *b, size_t length )
{
assert( b != NULL );
b->memory = malloc( length )
b->length = length;
// TRD : NULL on malloc() fail
return( b->memory );
}
int buffer_valid( struct buffer *b, size_t length )
{
assert( b != NULL );
if( b->memory == NULL or length > b->length )
return( 0 );
return( 1 );
}
void *buffer_get( struct buffer *b )
{
assert( b != NULL );
return( b->memory );
}
使用 API 而不是 malloc/free,你不会出错。