【问题标题】:malloc returns 0x100000000malloc 返回 0x100000000
【发布时间】:2011-07-18 11:33:56
【问题描述】:

malloc 有一个奇怪的问题。在用多个 malloc 分配 0x100000000,这导致访问时出现 SIGSEGV。我不知道出了什么问题。 errno 设置为 0 并且我在 ram 中有足够的空间,所以它不应该是空间问题。 malloc 返回的最后一个地址小于0x6255f0。知道要寻找什么吗?

关于我的系统的一些信息:

  • gcc 版本 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
  • 标志:-墙
  • uname: 2.6.35-27-generic #48-Ubuntu SMP Tue Feb 22 20:25:46 UTC 2011 x86_64 GNU/Linux

PMAP 输出:

Address           Kbytes     RSS   Dirty Mode   Mapping
0000000000400000       0      32       0 r-x--  tests
000000000060a000       0       4       4 r----  tests
000000000060b000       0       4       4 rw---  tests
000000000060c000       0     116     116 rw---    [ anon ]
00007ffff75cd000       0     348       0 r-x--  libc-2.12.1.so
00007ffff7747000       0       0       0 -----  libc-2.12.1.so
00007ffff7946000       0      16      16 r----  libc-2.12.1.so
00007ffff794a000       0       4       4 rw---  libc-2.12.1.so
00007ffff794b000       0      12      12 rw---    [ anon ]
00007ffff7950000       0      32       0 r-x--  libm-2.12.1.so
00007ffff79d2000       0       0       0 -----  libm-2.12.1.so
00007ffff7bd1000       0       4       4 r----  libm-2.12.1.so
00007ffff7bd2000       0       4       4 rw---  libm-2.12.1.so
00007ffff7bd3000       0      28       0 r-x--  liblinopt.so
00007ffff7bdb000       0       0       0 -----  liblinopt.so
00007ffff7dda000       0       4       4 r----  liblinopt.so
00007ffff7ddb000       0       4       4 rw---  liblinopt.so
00007ffff7ddc000       0     108       4 r-x--  ld-2.12.1.so
00007ffff7f6c000       0     432     432 rw---    [ anon ]
00007ffff7ff8000       0      12      12 rw---    [ anon ]
00007ffff7ffb000       0       4       0 r-x--    [ anon ]
00007ffff7ffc000       0       4       4 r----  ld-2.12.1.so
00007ffff7ffd000       0       4       4 rw---  ld-2.12.1.so
00007ffff7ffe000       0       4       4 rw---    [ anon ]
00007ffffffde000       0      16      16 rw---    [ stack ]
ffffffffff600000       0       0       0 r-x--    [ anon ]
----------------  ------  ------  ------
total kB            9160    1196     648

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bd8e67 in bound_knapsack (sizes=0x610b30, profits=0x610ad0, B=103, 
    limit=2) at /home/x/Development/binpacking/src/lib/knapsack.c:123

更新

运行 valgrind 揭示了问题:之前的几行代码是 calloc: calloc( n, sizeof(unsigned int)); 应该是: calloc( n, sizeof(unsigned int*)); 这导致分配的块太小,用于存储malloc的结果。 叹息

谢谢你的橡皮擦!

【问题讨论】:

  • 你能发布你正在使用的代码吗? (请尽可能使用小代码 sn-p 来演示这一点。)另外,请记住“内存不足”!=“内存不足”,这意味着“地址空间不足”并且 Linux 默认会过度使用内存,所以地址空间分配可能会成功,但在页入时访问分配可能会失败(尽管如果您有大量可用内存,这不太可能成为问题)。
  • 这可能是由于另一个 malloced 块中的某种内存损坏。您是否尝试过通过valgrind 运行它?
  • 您可能在其他地方遇到了问题,当您尝试分配更多内存时就会表现出来。
  • -1 因为那个“问题”并没有给 SO 添加任何东西

标签: c pointers malloc


【解决方案1】:

尝试在您的程序中添加以下行:

#define MALLOC_CHECK_ 3

这应该会导致使用不同版本的malloc,它可以检测某些错误并向您报告。有关详细信息,请参阅malloc man page 的“注释”部分。

【讨论】:

    【解决方案2】:

    malloc 工作正常,但结果未存储。 (见更新)。 谢谢你的建议。

    如果您仍然不想看到某些代码: github/knapsack.c

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 1970-01-01
      • 2015-06-14
      • 2016-05-24
      • 1970-01-01
      • 2017-07-30
      • 2015-07-15
      • 2020-09-03
      • 2019-01-05
      相关资源
      最近更新 更多