malloc问题?

时间:2011-02-23 18:53:30

标签: c memory malloc

您好我使用malloc()生成这样的缓冲区,其中buffer是char *

buffer = (char*)malloc(chunksize+1);
  for (k = 0; k < chunksize; k++) {
    buffer[k] = (char) (j+k);
  }

然而,在调试器中我可以看到缓冲区[3]例如是我写的字符,但缓冲区缓冲区是空的(很多空格)。但是第二次我在free(缓冲区)之后在缓冲区中写东西,它会显示我第一次写的内容,并覆盖它。谁能告诉我为什么?谢谢!!

3 个答案:

答案 0 :(得分:8)

一般来说,malloc实现的工作方式是从操作系统获取大量内存,然后在请求缓冲区时对其进行子位分配。这是因为从操作系统获取内存相对较慢。

作为安全措施,您的操作系统将提供malloc空白内存(满0或其他重复值)。您不希望一个进程能够读取不相关进程的离开。

但是,malloc没有这样的问题,因为它只能从一个块到一个进程。如果你能看到自己的离开并不重要(至少不是来自安全POV)。

所以发生的事情是你已经使用了一个缓冲区,并且最初看到它是空白的。然后你释放它并要求“另一个”缓冲区,而malloc恰好再次向你传递了相同的内存,这次包含了你留下的值。

获得相同内存两次的“巧合”并非不太可能,因为malloc有充分的理由在可能的情况下重新使用最近使用的内存 - 它更有可能在缓存中。 / p>

您可能认为这对您无关紧要,因为通常您不会从新分配的内存中读取内容。但它对malloc很重要,因为通常malloc会将自己的内务数据保存在缓冲区附近。如果与从缓存中驱逐内存相关的成本也可能很重要 - 如果你被“欺骗”一遍又一遍地重复使用相同的内存,那么这种情况就会少发生。

答案 1 :(得分:1)

一个问题可能是您尝试使用char或同等效果打印printf缓冲区?您缺少分配

buffer[chunksize] = 0;

所以你的缓冲区没有很好地终止。它背后可能有任何东西,例如'\r'

如果另一方面buffer不代表您的字符串,最好使用不同的基本类型,可能是unsigned char

答案 2 :(得分:0)

您的代码是正确的。如果您担心覆盖一些不良内存,问题可能出在您未显示的部分代码中。例如,如果buffer是指向非char数组的指针,那么您使用的pointer arithmetic将导致错误的内存访问(损坏)。您可以使用以下程序作为参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main ()
{
  const size_t chunksize = 15;
  size_t k;
  char *buffer;

  buffer = malloc (chunksize + 1);
  memset (buffer, 0, chunksize + 1);

  for (k = 0; k < chunksize; ++k)
    {
      buffer[k] = '0' + (char)k + 49;
    }

  for (k = 0; k < chunksize; ++k)
    {
      printf ("%lu = %c\n", k, buffer[k]);
    }

  free (buffer);

  return 0;
}

输出:

0 = a
1 = b
2 = c
3 = d
4 = e
5 = f
6 = g
7 = h
8 = i
9 = j
10 = k
11 = l
12 = m
13 = n
14 = o