可变地址会因我们是否使用它而改变?

问题描述 投票:0回答:1

有人能解释一下吗?

考虑一下这个程序。我们写修改 dest[10] 故意看 j 修改后的值。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char source[] = "Hello";
    int j = 100;
    char dest[10];
    dest[12] = 'A';
    printf("j   = %d \n", j);
    fflush(stdout);
    printf("j   = %d \n", j);
    fflush(stdout);
    printf("*j   = %p \n", &j);   // comment this line to get another result!
    return 0;
}

输出。

j   = 4259940
j   = 4259940
*j   = 0x7ffcc4cdef74

但如果我们在显示 j 瓦里巴利地址 printf("*j = %p \n", &j); 我们得到。

j   = 100
j   = 100

这就像 j 储存在其他地方,而不仅仅是在 dest 和第一个例子中的变量一样。

有没有人可以解释一下?

c arrays pointers buffer-overflow
1个回答
1
投票

对象的存放位置和是否存放 jdest 中如何处理界外访问的问题。dest[10] 是编译器的选择。现代编译器会做很多复杂的事情来优化程序。当你省略了打印地址的语句时。j,编译器会做出不同的选择,这些选择会产生不同的结果。


1
投票

一个变量如果不取地址,就不需要有任何存储地址.编译器可以自由地只将值保存在寄存器中,或者通过优化机制将其完全删除,只使用常量值 100 直接。

你可以检查一下你是否损坏了 dest 反之 j 不存储在堆栈上。

© www.soinside.com 2019 - 2024. All rights reserved.