【发布时间】:2015-09-02 22:54:15
【问题描述】:
原代码是:
int main(){
int sam= 19;
int *pSam= &sam;
printf("Address \t name \t value\n");
printf("%p \t %s \t %d\n", pSam, "sam", sam);
return 0;
sam的内存地址显示为= 0028FF18。
但是,如果我对变量没有任何更改,只需在“返回 0;”上方添加另一行代码也就是:
printf("%p \t %s \t %p", &pSam, "sam", pSam);
然后运行程序,sam的内存地址变成了0028FF1C,虽然我只是打印了一些基本的东西。
这是为什么呢?
【问题讨论】:
-
第一个例子中
sam的地址如果不打印是怎么知道的,因为你只在第二个例子中添加了printf("%p \t %s \t %p", &pSam, "sam", pSam)? -
可能是在第一种情况下,编译器优化了
int *pSam= &sam;,因此堆栈上的变量少了一个。 -
@ouah 我包含了 pSam,它基本上打印出内存地址 sam。
-
@mustaccio 当你说优化你的意思时?地址比原来大了 4 个字节:(从 0028FF18 到 0028FF1C )堆栈寻址增长从小到大。
-
您确实需要将传递给
printf的指针转换为(void *)-> 检查标准(关于“指针应为void *类型”我>