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

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

char *buffer = (char *)malloc(sizeof(char) * 10); 

做一个

 int numElements = sizeof(buffer); 

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

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

对于GNU glibc:

 SYNOPSIS #include  size_t malloc_usable_size (void *ptr); 

描述

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

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

由于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,你不会出错。

sizeof用于计算实际对象的大小,而不是内存中对象的指针。 它返回结构或基元的大小。 我的意思是它会工作,但会给你指针的大小,而不是它指向的结构。 要获得任何类型的数组使用的长度:

的strlen(缓冲液)