首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >malloc问题?

malloc问题?
EN

Stack Overflow用户
提问于 2011-02-24 02:53:30
回答 3查看 2.3K关注 0票数 3

您好,我使用malloc()生成一个缓冲区,如下所示,其中buffer是一个char*

代码语言:javascript
复制
buffer = (char*)malloc(chunksize+1);
  for (k = 0; k < chunksize; k++) {
    buffer[k] = (char) (j+k);
  }

然而,在调试器中,我可以看到例如buffer3是我写入的字符,但是缓冲区是空的(有很多空格)。但当我在free( buffer )之后第二次在buffer中写东西时,它显示了我第一次写的内容,并覆盖了它。有人能告诉我为什么吗?谢谢你!!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-24 05:47:30

一个问题可能是你试图用printf或类似的东西打印你的char缓冲区?您缺少分配

代码语言:javascript
复制
buffer[chunksize] = 0;

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-02-24 02:59:11

一般而言,malloc实现的工作方式是从操作系统获取一大块内存,然后在请求缓冲区时再分配其中的一些位。这是因为从操作系统获取内存相对较慢。

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

然而,malloc没有这样的问题,因为它只为一个进程提供服务。如果您可以看到自己的剩余内容(至少不能从安全POV中看到),这并不重要。

所以发生的情况是,您错误地分配了一个缓冲区,并且最初看到它是空的。然后释放它并请求“另一个”缓冲区,而malloc碰巧又给了您相同的内存,这一次包含了您留在其中的值。

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

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

票数 8
EN

Stack Overflow用户

发布于 2011-02-24 03:05:46

您的代码是正确的。如果您担心会覆盖一些坏内存,那么问题可能出在代码的某些部分,而您没有展示这些部分。例如,如果buffer是指向非字符数组的指针,在这种情况下,您使用的pointer arithmetic将导致错误的内存访问(损坏)。您可以使用以下程序作为参考:

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5095619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档