您好,我使用malloc()生成一个缓冲区,如下所示,其中buffer是一个char*
buffer = (char*)malloc(chunksize+1);
for (k = 0; k < chunksize; k++) {
buffer[k] = (char) (j+k);
}然而,在调试器中,我可以看到例如buffer3是我写入的字符,但是缓冲区是空的(有很多空格)。但当我在free( buffer )之后第二次在buffer中写东西时,它显示了我第一次写的内容,并覆盖了它。有人能告诉我为什么吗?谢谢你!!
发布于 2011-02-24 05:47:30
一个问题可能是你试图用printf或类似的东西打印你的char缓冲区?您缺少分配
buffer[chunksize] = 0;所以你的缓冲区没有被很好的终止。它的背后可能有任何东西,例如'\r'。
另一方面,如果buffer不能为您表示字符串,最好使用不同的基类型,可能是unsigned char。
发布于 2011-02-24 02:59:11
一般而言,malloc实现的工作方式是从操作系统获取一大块内存,然后在请求缓冲区时再分配其中的一些位。这是因为从操作系统获取内存相对较慢。
作为一种安全措施,您的操作系统将给malloc提供空白内存(满是0或其他一些重复的值)。您不会希望一个进程能够读取不相关进程的剩余部分。
然而,malloc没有这样的问题,因为它只为一个进程提供服务。如果您可以看到自己的剩余内容(至少不能从安全POV中看到),这并不重要。
所以发生的情况是,您错误地分配了一个缓冲区,并且最初看到它是空的。然后释放它并请求“另一个”缓冲区,而malloc碰巧又给了您相同的内存,这一次包含了您留在其中的值。
这种两次获得相同内存的“巧合”并不是很不可能,因为malloc有充分的理由在可能的情况下重用最近使用的内存-它更有可能在缓存中。
您可能认为这对您来说无关紧要,因为通常您不会从新分配的内存中读取数据。但这对malloc来说很重要,因为通常情况下,malloc会在缓冲区附近保留自己的内部数据。如果存在与从缓存中驱逐内存相关的成本,这也可能很重要-如果您可以被“欺骗”一次又一次地重复使用相同的内存,那么这种情况发生的可能性就会更小。
发布于 2011-02-24 03:05:46
您的代码是正确的。如果您担心会覆盖一些坏内存,那么问题可能出在代码的某些部分,而您没有展示这些部分。例如,如果buffer是指向非字符数组的指针,在这种情况下,您使用的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 = ohttps://stackoverflow.com/questions/5095619
复制相似问题