11

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

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

做一个

int numElements = sizeof(buffer); 

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

4

5 回答 5

26

对于 GNU glibc:

SYNOPSIS

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

描述

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

于 2013-07-11T19:34:04.567 回答
17

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

于 2012-05-17T16:30:34.530 回答
8

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

于 2012-05-17T16:37:16.380 回答
5

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

顺便说一句,对于

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

有趣的是,

 sizeof "hello, world\n"

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

于 2012-05-17T16:33:12.030 回答
2
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,你不会出错。

于 2012-05-17T16:37:31.220 回答