为什么将指针值增加一个不允许在该位置设置值?

时间:2015-09-01 07:46:14

标签: c pointers

#include<stdio.h>;
void main(){
  int x=10;
  int *y=&x+1;
  *y=15;
  printf("\n Address of x is %u",&x);
  printf("\n Value of y is %d",*y);
}  

在此代码中,为什么*y的值不是15, 在输出中x = 25908的值和y = 25912的值? 我想知道当我把x的下一个地址的值设为15时,为什么15不显示为输出?

3 个答案:

答案 0 :(得分:5)

在您的代码中,通过编写

 int *y=&x+1;

您正在访问未分配给您的进程(程序)的内存。它调用undefined behaviour

如果x是一个数组名,并且为偏移量(这里是值1)分配了足够的内存,则取消引用获取的{{1}从这个操作本来是合法的。但是,在这里,y是一个变量,你不能期望访问所谓的 next 地址,它是无效的。

也就是说,要打印地址,请始终使用表格

x

或类似的。

答案 1 :(得分:4)

因为你正在做的事情有未定义的行为。您正在写入未知地址(x + sizeof(int)字节的地址)并且您不知道编译器在该地址中放置了什么以及它如何排列局部变量的顺序。

也许在printf调用的堆栈上推送的参数已覆盖15并且可能发生了其他任何事情。

请注意,使用不同的标志和优化级别编译相同的代码可能会导致不同的结果。换句话说,未定义的行为

答案 2 :(得分:3)

当你这样做时

x= 10;

你有内存分配存储值10,内存位置是&x所以这是你可以访问的内存,访问无主内存会导致未定义的行为,在这种情况下你正在访问{{1这不在你的控制之下