实践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+2int类型对象的地址。你的程序可以做任何事情碰巧它打印出了特定的值。但它也有可能因为分割错误而失败。
为什么不管我们改变变量多少次,这个值都保持不变?
暂且不谈未定义的行为,更改一个内存位置的值对另一个位置的值没有影响,这并不奇怪为什么您希望更改x[0]会对x[1]产生任何影响?
通过对未定义行为的推理,实际上并没有那么多收获。您可以在调试器下研究编译后的程序,毫无疑问,您可以找出编译器/链接器在该地址放置了什么。但几乎任何改变都可能扰乱这种行为。

关于c - 指针的工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24464417/

10-10 06:45