我不明白为什么,如果我从下面的代码中删除评论,我会遇到分段错误。
#include <stdio.h>
int main(){
int var = 9;
int *ptr;
*ptr = 20;
int *ptrD;
*ptrD = 26;
printf("var %d\n", var);
printf("*ptr %d\n", *ptr);
printf("*ptrD %d\n", *ptrD);
*ptr = 18;
printf("*ptr %d\n", *ptr);
*ptrD = 24;
printf("*ptrD %d\n", *ptrD);
return 0;
}
答案 0 :(得分:3)
在您的代码中,
printf("*ptrD %d\n", *ptrD);
ptrD
未初始化,并指向某个随机位置。效果:undefined behavior。
同样适用于
*ptrD = 26;
printf("*ptrD %d\n", *ptrD);
太
您想要或许 ,(但错过)
ptrD = &var;
作为定义之后的下一个陈述。
[P.S - 你应该感谢由于UB,申请人没有使用你的信用卡为所有同事订购披萨和小马。分开笑话,一旦你击中UB,什么都没有,绝对没有任何保证。]
答案 1 :(得分:1)
您也应该在此代码中遇到分段错误。
您正在访问指针而不向其分配内存
//printf("*ptr %d\n", *ptr);
printf("*ptrD %d\n", *ptrD);
*ptrD
尚未分配内存,因此未初始化,并指向随机内存地址。访问它会给你分段错误。
答案 2 :(得分:0)
这些指针未初始化,您取消引用它们,最终会导致未定义的行为。
这些陈述 -
printf("*ptrD %d\n", *ptrD);
...
*ptrD = 26;
printf("*ptrD %d\n", *ptrD);
获得工作的可能方式之一 -
#include <stdio.h>
int main(void){
int var = 9;
int *ptr=&var; // ptr points to var
int *ptrD=&var; // ptrD points to var
/* both the pointers now have the address of variable var */
printf("var %d\n", var);
printf("*ptrD %d\n", *ptrD);
*ptrD = 26; // change value at address pointed by ptrD
/* this will change the value of the var , i.e now var is 26 */
printf("*ptrD %d\n", *ptrD);
return 0;
}