#include <stdio.h>
#include <stdlib.h>
void process_keys34 (int * key3, int * key4) {
*(((int *)&key3) + *key3) += *key4;
}
int main (int argc, char *argv[])
{
int key3, key4;
if (key3 != 0 && key4 != 0) {
process_keys34(&key3, &key4);//first time
}
if (true) {
process_keys34(&key3, &key4);
msg2 = extract_message2(start, stride);//jump to here
printf("%s\n", msg2);
}
}
我在MacOS 10.12上使用Xcode7测试了这些代码。
这个问题可以简单地描述为
为什么
&key3 == (int*)&key3
但是
&key3 + 2 != (int*)&key3 + 2
和
&key3 + 2 == (int*)&key3 + 4
使用XCode7时
我从argv设置了key3和key4,我想从
process_keys34(&key3, &key4);//first time
跳转到msg2 = extract_message2(start, stride);//jump to here
。因此,我必须更改func process_key34的返回地址的值。
因为在&key3和返回地址之间有一个var key4,所以我应该在&key3上加上2,这意味着key3应该是2。但是事实是key3必须是4,然后结果是正确的。
然后在lldb中进行一些测试。
我找到
(lldb) p *(&key3 + 2)
(int *) $6 = 0x0000000100000ec3 //that's right.
但
(lldb) p *((int*)&key3+2)
(int) $8 = 1606416192// I dont know what does that mean.
然后我测试
(lldb) p &key3
(int **) $5 = 0x00007fff5fbff6d8
(lldb) p (int*)&key3
(int *) $7 = 0x00007fff5fbff6d8
我发现这两个是相同的。
但是
&key3 + 2 ,(int*)&key3 + 2
彼此不同。(lldb) p &key3 + 2
(int **) $9 = 0x00007fff5fbff6e8
(lldb) p (int*)&key3 + 2
(int *) $10 = 0x00007fff5fbff6e0
和
&key3 + 2 ,(int*)&key3 + 4
相同(lldb) p &key3 + 2
(int **) $9 = 0x00007fff5fbff6e8
(lldb) p (int*)&key3 + 4
(int *) $14 = 0x00007fff5fbff6e8
我发现&key3是int **,而(int *)&key3是int *,这是这两个命令之间的唯一区别。但是我仍然不明白为什么会这样。
因为加到C99,所以+的右侧部分将变为左侧的相同类型,这意味着整数2将变为int *或int **。但是我认为它们没有区别,因为sizeof(int *)== sizeof(int **)。
我不知道为什么会这样。有人可以帮我些忙吗?
最佳答案
原因&key3
和(int *)&key3
(请注意,我认为key3
是int *
)的类型不同。
这被命名为pointer arithmetic。
在某些系统上sizeof(int) != sizeof(int *)
。因此,(int *) + 2
与(int **) + 2
的效果不同,因为
(int *) + 2 ==> * + (2 * sizeof(int))
(int **) + 2 ==> * + (2 * sizeof(int *)).
关于c++ - 为什么p&key3 + 2和p(int *)&key3 + 2在LLVM中会打印不同的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40277047/