#include<stdio.h>
int main()
{
int k=0;
int* p=&k;
printf("%d %d\n", p, k);
*p++;
printf("%d %d\n", p, k);
(*p)++;
printf("%d %d\n", p, k);
}
上面的代码在Dev C ++中打印出来:
6422184 0
6422188 0
6412189 0 // p增加1 - > ???
上面的代码在ideone.com中打印出来:
368737692 0
368737696 0
368737696 0
#include<stdio.h>
int main()
{
int k=0;
int* p=&k;
int* t=p; // the only difference
printf("%d %d\n", p, k);
*p++;
printf("%d %d\n", p, k);
(*p)++;
printf("%d %d\n", p, k);
}
上面的代码在Dev C ++中打印出来:
6422180 0
6422184 0
6412184 0
我认为(* p)++会增加变量p指向的值。所以我相信第一个代码应该在Dev C ++中打印出来:
6422184 0
6422188 0
6412188 0
int * t的存在是否会影响(* p)++的工作方式?或者这只是一种未定义的行为?我对指针很弱,请帮忙!
答案 0 :(得分:1)
你好,我终于理解了你的问题,我想我有一个解释。
#include<stdio.h>
int main()
{
int k=0;
int* p=&k; // p will point to k ( p -> k)
printf("%d %d\n", p, k); // you will print p(k address) and k value
*p++; // you increment p value so p NO LONGER points to k !!!
// p now holds another memory address (it is not related to k anymore)
printf("%d %d\n", p, k); // you print the new p value and k value
(*p)++; // here happens UNDEFINED BEHAVIOR
//you increment a value and you know nothing about it
// is it an int ? is it a char ? is it p adress itself ? ... ???
printf("%d %d\n", p, k);
}
我已经在更多的编译器上尝试了你的代码,我得到了不同的结果(甚至在Ubuntu下的gcc)。 希望这有帮助,谢谢。
答案 1 :(得分:0)
首先使用p
指向k
,这是一个本地标量变量,它是一个单独的int。然后递增p
。由于k
不是数组,因此递增p
会导致指针无效(不指向任何内容),然后取消引用它会导致未定义的行为。
未定义的行为意味着可能会发生 ANYTHING 。任何东西。虽然您可能认为通过递增指针读取只会给出k
之后在内存中发生的任何事情,但是没有任何保证会发生。编译器可以自由地生成实际更改不相关事物值(例如p
的值)的代码,这些代码似乎是一个无法改变任何值的简单读取。
在你的情况下,你实际上修改(增加)指向无效指针的值,因此它更可能导致奇怪和不可预测的结果 - 比如重置p
的值