【问题标题】:malloc function assigns all data to same memory addressmalloc 函数将所有数据分配到相同的内存地址
【发布时间】:2014-12-23 08:00:54
【问题描述】:

现在,当我打印块数组中的每个元素时,每个元素都有相同的地址。例如:

ints:   20 bytes stored at 0xbffa84fc 
doubles:   80 bytes stored at 0xbffa84fc 
chars:   8 bytes stored at 0xbffa84fc 
Students:   1008 bytes stored at 0xbffa84fc

【问题讨论】:

  • 通过添加打印代码进行了改进。但请记住,真正的"Minimal, Complete, Verifiable Example" 可以被复制粘贴和编译。这意味着 HeapType 和 BlockType 以及 #include <stdio.h> 的正确包含和定义。然后问:你能证明这个问题让你感到困惑吗?你有四个mh_alloc 电话...... 4 有什么特别之处而 2 无法证明?他们是否需要“int”和“double”类型,或者你可以减少它吗?少即是多,您可能会自己发现问题!

标签: c malloc dynamic-memory-allocation


【解决方案1】:
blk->addr = &blk;

分配内存的地址其实就是blk本身。但是这里,你使用的是&blk,即blk的地址。

【讨论】:

  • 似乎即使是最琐碎的编译器警告也应该注意到这一点。
【解决方案2】:

malloc 返回一个空指针。

这里它返回一个指向“blk”的空指针,但是被强制转换为数据类型“BlockType”。所以,'blk' 已经保存了分配内存的地址,但语句'blk->addr = &blk' 指向'blk' 的地址,这显然是相同的。

【讨论】:

  • 我不会那么“明显”。在实现级别上,函数中的局部变量没有义务在不同的调用中位于相同的地址。在这种情况下,它碰巧 是正确的,并且由于大多数编译器的实现方式而经常处于这种调用模式中......但人们不应该依赖它。 (例如,如果函数包含可变长度数组怎么办......?)
  • 是的,我也只是指同一点,但没有明确提及。
猜你喜欢
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2018-08-03
  • 2014-10-12
  • 2012-04-29
相关资源
最近更新 更多