B[] 数组仅在function() 运行时存在(它是本地)。返回后它是未引用的。
如果您的任务文本被精确引用,那么您似乎必须深入研究 malloc。然后我现在说:
使用malloc的原因,如下正文:
“返回一个新数组”
“只取一个数组和计数器”,而不是第三个参数或重用A。
不要被使用全局数组的诱惑;),你可能被允许使用静态? -(编辑:@Clifford 在为什么不这样做上有很好的观点)
祝你好运!
编辑:
另外:您没有“获取内存地址而不是值”。
当function() 被调用时,它会给出一个返回地址。其次,该函数中 local 变量的内存是保留的,并且它们的名称已给出地址。 IE。类似:
/* assuming 4 byte int */
[ 0xA4 ... 0xAF ] <-- int B[3] -- 3 * 4 = 12 bytes
[ 0xB0 ... 0xB4 ] <-- int i -- 4 bytes
[ 0xB5 ... 0xB9 ] <-- int j -- 4 bytes
[ 0xBA ... 0xBE ] <-- int temp -- 4 bytes
当函数返回时,这些区域被释放。由于没有使用电源来擦除数据,因此它保留在那里,但可以随时在另一个操作使用该区域时被覆盖。
即从您的代码可能是printf() 或者它可能是完全不同的东西。重点是它不是保留的,可以用于“whatever”。 (不做煎饼,但我想你明白了)。
因此,当您打印 func 的值并得到 2 个正确和一个错误时,这意味着前两个尚未被覆盖,而最后一个已被另一个调用覆盖。它甚至可能正在使用中。
最后一个值不是地址,而是另一个解释为整数的值。它也不必是 int。如果另一个函数向该区域写入了一个短整数或一个字符(很可能是 4 个字节),那么您所做的就是读取 4 个字节并将这些位解释为一个整数。
说:
B[2] == 6 (on a 4 bytes, int 32, system)
Address: 0xAC 0xAD 0xAE 0xAF As bit sequence
Value : 6 0 0 0 ==> [0000 0110 0000 0000 0000 0000]
返回main,fun[2] -> [0xC 0xD 0xE 0xF]
函数在其他地方定义了char(1 字节)并获得现在空闲的地址0xD
它将值 123 写入该地址。
现在我们有了:
fun[2]:
Address: 0xAC 0xAD 0xAE 0xAF As bit sequence
Value : 6 123 0 0 ==> [0000 0110 0111 1011 0000 0000]
或者,如果我们在 little-endian 系统(如我的系统)上将其转换为整数,我们会得到
+--------- Least significant byte
|
Address: 0xAC 0xAD 0xAE 0xAF
Value : 6 123 0 0 ( == 0x06 0x7B 0x00 0x00 )
Sort to "human Anglo left right order"
0 0 123 6 => 0x00007B06 == 31494 (int, "normal human number"), and the number
you print when doing the for() loop in
main.
也可以像这样使用相关字节
+----- bytes of fun[2]
|
_________+_________
[ ]
char foo 0xAC |
int bar 0xAD 0xAE 0xAF 0xB0
[____+______________]
|
+---- bytes of bar
数字 1 和 2 是正确的事实并不能保证字节没有改变。可以将相同的值写入该位置。 0 可能已写入 int 等的字节 2。
胡佛展示:
*作为一个半注释,只是为了进一步混淆,它可能是一个地址,但然后是该地址的整数表示。事实上,这不太可能......它可能是某些操作的返回地址,您将其解释为 int。*
希望您能从中获得至少 1% 的收益。我正在积极学习自己,解释往往是在学习:)