我有一个缓冲区,并且想要进行测试,以查看缓冲区是否具有足够的容量,即找出我可以添加到该缓冲区的元素数量。
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)或相关函数分配的。
size_t no_elements = malloc_usable_size(buffer);
和 printf("%ld\n", no_elements);
时,它返回了24。我错过了什么?顺便说一下,(void *buffer)
报错了。 - undefined你不能进行这样的测试。记住你分配了多少内存是你自己的责任。如果缓冲区是由他人提供的,则要求他们同时传递大小信息,并使其成为他们传递正确值或让程序崩溃的责任。
buffer
只是一个指针,没有大小信息。然而,malloc()
例程将保存您所做的分配的大小,因此当您释放它时,它会释放正确数量的空间。因此,除非您想深入了解malloc()
的功能,否则建议您自己保存分配的大小(有关可能的实现,请参见其他API答案中的示例)。
由于buffer
是一个指针(而不是数组),sizeof
运算符返回的是指针的大小,而不是它所指向的缓冲区的大小。没有标准的方法来确定这个大小,因此你必须自己进行簿记(即记住你分配了多少)。
顺便说一句,对于其他情况也是如此。
char *p = "hello, world\n"; /* sizeof p is not 13. */
sizeof "hello, world\n"
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,你就不会出错。
malloc
函数,使用系统 malloc
分配四个额外字节,将分配的长度存储在其中,并在此长度后返回指针。然后,你可以编写一个 getSize
方法,使用指针算术运算再次获取它。这样可以让你使用看起来像是 malloc
和 free
的调用。 - Gort the Robot