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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可变地址会因我们是否使用它而改变?相关的知识,希望对你有一定的参考价值。

有人能解释一下吗?

考虑一下这个程序。我们写修改 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 
", j);
    fflush(stdout);
    printf("j   = %d 
", j);
    fflush(stdout);
    printf("*j   = %p 
", &j);   // comment this line to get another result!
    return 0;
}

输出。

j   = 4259940
j   = 4259940
*j   = 0x7ffcc4cdef74

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

j   = 100
j   = 100

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

有没有人可以解释一下?

答案

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

另一答案

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

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

以上是关于可变地址会因我们是否使用它而改变?的主要内容,如果未能解决你的问题,请参考以下文章

python —— 可变与不可变类型

python中字符串数据类型是不可变数据类型

Python 面试高频问题:可变数据类型和不可变数据类型的区别

Python 面试高频问题:可变数据类型和不可变数据类型的区别

可变与不可变数据类型详解

python中不可变数据类型和可变数据类型