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

时间:2012-05-17 16:28:20

标签: c malloc buffer buffer-overflow

我有一个缓冲区并且想要进行测试以查看缓冲区是否具有足够的容量I.e.找到我可以添加到缓冲区的元素数量。

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

做一个

int numElements = sizeof(buffer); 

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

6 个答案:

答案 0 :(得分:22)

对于GNU glibc:

SYNOPSIS

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

说明

  

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

答案 1 :(得分:13)

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

答案 2 :(得分:7)

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

BTW,

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

有趣的是,

 sizeof "hello, world\n"

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

答案 3 :(得分:6)

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

答案 4 :(得分:1)

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

答案 5 :(得分:-1)

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

  

strlen的(缓冲液)

相关问题