您好我使用malloc()生成这样的缓冲区,其中buffer是char *
buffer = (char*)malloc(chunksize+1);
for (k = 0; k < chunksize; k++) {
buffer[k] = (char) (j+k);
}
然而,在调试器中我可以看到缓冲区[3]例如是我写的字符,但缓冲区缓冲区是空的(很多空格)。但是第二次我在free(缓冲区)之后在缓冲区中写东西,它会显示我第一次写的内容,并覆盖它。谁能告诉我为什么?谢谢!!
答案 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