指针的工作

Ved*_*ant 1 c pointers

Practice.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;
}
Run Code Online (Sandbox Code Playgroud)

上述代码的输出如下:

                  Value of A = 6
                  Value of X = 2686680
              New Value of X = 2686688
Value at address stored in X = 16
Run Code Online (Sandbox Code Playgroud)


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;
}
Run Code Online (Sandbox Code Playgroud)

上述代码的输出是:

                  Value of I = 8
                  Value of P = 2686680
              New Value of P = 2686688
Value at address stored in P = 16
Run Code Online (Sandbox Code Playgroud)


4th即使在我不断更改变量及其各自的值之后,输出中的这一行仍保持不变.所以我删除Practice.c并编写了一个名为Test.c相同代码和格式的新程序Practice.c.

TEST.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;
}
Run Code Online (Sandbox Code Playgroud)

输出Test.c如下:

                  Value of A = 6
                  Value of X = 2686680
              New Value of X = 2686688
Value at address stored in X = 2686723
Run Code Online (Sandbox Code Playgroud)


现在,当我Test.c从头开始重新编写新变量时,程序的输出如下:

                  Value of I = 8
                  Value of P = 2686680
              New Value of P = 2686688
Value at address stored in P = 2686723
Run Code Online (Sandbox Code Playgroud)

同样,4th输出线保持不变.

问题

1- 4th行中的值Garbage Value,如果它是为什么这个值保持不变,无论我们在同一文件名下使用多少次更改变量?

2- 4th当我们在不同的文件名下保存相同的代码时,为什么行的值会发生变化?

Dav*_*nan 5

您的程序显示未定义的行为,因为根本没有理由相信这x+2是类型对象的地址int.你的程序可以做任何事情.碰巧它打印出那个特定的价值.但它可能同样会因分段错误而失败.

无论我们更改变量多少次,为什么这个值保持不变?

暂时不考虑未定义的行为,改变一个内存位置的值对另一个内存位置的值没有影响也就不足为奇了.为什么你会期望这种改变会对你x[0]有什么影响x[1]

通过推理未定义的行为,并没有太多可以获得的东西.您可以在调试器下研究编译的程序,毫无疑问可以解决编译器/链接器在该地址上的位置.但几乎任何变化都可能会扰乱行为.