实践c
#include <stdio.h>
int main(void)
{
int a=6,*x;
x=&a;
printf("\n Value of A = %d",a);
printf("\n Value of X = %u",x);
x=x+2;
printf("\nNew Value of X = %u",x);
printf("\nValue at address stored in X = %d",*x);
return 0;
}
上述代码的输出如下:
Value of A = 6
Value of X = 2686680
New Value of X = 2686688
Value at address stored in X = 16
我从新变量和新值开始重新编写
Practice.c
的代码。Practice.c
#include <stdio.h>
int main(void)
{
int i=8,*p;
p=&i;
printf("\n Value of I = %d",a);
printf("\n Value of P = %u",x);
p=p+2;
printf("\nNew Value of P = %u",x);
printf("\nValue at address stored in P = %d",*x);
return 0;
}
上述代码的输出为:
Value of I = 8
Value of P = 2686680
New Value of P = 2686688
Value at address stored in P = 16
这个
4th
行在输出中保持不变,即使在我不断更改变量及其各自的值之后。所以我删除了
Practice.c
并编写了一个名为Test.c
的新程序,其代码和格式与Practice.c
相同。测试c
#include <stdio.h>
int main(void)
{
int a=6,*x;
x=&a;
printf("\n Value of A = %d",a);
printf("\n Value of X = %u",x);
x=x+2;
printf("\nNew Value of X = %u",x);
printf("\nValue at address stored in X = %d",*x);
return 0;
}
Test.c
的输出如下: Value of A = 6
Value of X = 2686680
New Value of X = 2686688
Value at address stored in X = 2686723
现在,当我从新变量开始重新编写
Test.c
时,程序的输出如下: Value of I = 8
Value of P = 2686680
New Value of P = 2686688
Value at address stored in P = 2686723
同样,输出的
4th
行保持不变。问题
1-如果是,那么
4th
行中的值是否为Garbage Value
,为什么在使用相同的文件名时,无论我们更改变量多少次,该值都保持不变?2-为什么在不同的文件名下保存相同的代码时
4th
行的值会发生变化? 最佳答案
您的程序表现出未定义的行为,因为根本没有理由相信x+2
是int
类型对象的地址。你的程序可以做任何事情碰巧它打印出了特定的值。但它也有可能因为分割错误而失败。
为什么不管我们改变变量多少次,这个值都保持不变?
暂且不谈未定义的行为,更改一个内存位置的值对另一个位置的值没有影响,这并不奇怪为什么您希望更改x[0]
会对x[1]
产生任何影响?
通过对未定义行为的推理,实际上并没有那么多收获。您可以在调试器下研究编译后的程序,毫无疑问,您可以找出编译器/链接器在该地址放置了什么。但几乎任何改变都可能扰乱这种行为。
关于c - 指针的工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24464417/