分割错误有两个指针

时间:2015-12-24 10:44:45

标签: c pointers segmentation-fault

我不明白为什么,如果我从下面的代码中删除评论,我会遇到分段错误。

#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;
    }

3 个答案:

答案 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;
}