malloc()函数是否分配连续的内存块?

40

我有一段代码,是由一个非常老派的程序员编写的 :-) 。它的大致内容如下:

typedef struct ts_request
{ 
  ts_request_buffer_header_def header; 
  char                         package[1]; 
} ts_request_def; 

ts_request_def* request_buffer = 
malloc(sizeof(ts_request_def) + (2 * 1024 * 1024));

该程序员基本上是在处理缓冲区溢出的概念。我知道这段代码看起来可疑,所以我的问题是:

  1. malloc 函数是否总是分配连续的内存块?因为如果这段代码中分配的块不是连续的,那么代码将会崩溃。

  2. 执行 free(request_buffer),是否会释放由 malloc 分配的所有字节,即 sizeof(ts_request_def) + (2 * 1024 * 1024), 还是只会释放结构体 sizeof(ts_request_def) 的大小的字节?

  3. 您是否发现这种方法存在任何明显的问题?我需要与老板讨论并指出这种方法的任何漏洞。


1
这不是与这个模式相同吗 https://dev59.com/YXI95IYBdhLWcg3w_zQN - Romain Hippeau
2
“the blocks”-- 这个问题假设 malloc(和 free)可以区分其参数的加数并产生两个“块”,因为计算中有一个 +,这显然是荒谬的。 - Jim Balter
14个回答

2
想要补充一点,这不仅是常见的做法,而且我可能会称之为标准实践,因为Windows API中充满了这样的用法。例如,请检查非常常见的BITMAP头结构。

http://msdn.microsoft.com/en-us/library/aa921550.aspx

最后一个RBG四元组是一个大小为1的数组,这取决于正好使用这种技术。


1

问题1和2的答案是肯定的。

关于丑陋(即问题3),程序员试图用分配的内存做什么?


0

这里需要注意的是malloc看不到这个计算过程

malloc(sizeof(ts_request_def) + (2 * 1024 * 1024));

这与之前的相同。

  int sz = sizeof(ts_request_def) + (2 * 1024 * 1024);
   malloc(sz);

你可能认为它分配了两个内存块,在你的脑海中它们是“结构体”、“一些缓冲区”。但是malloc根本不这样看。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接