【问题标题】:Segmentation fault with two pointers带有两个指针的分段错误
【发布时间】:2015-12-24 10:44:45
【问题描述】:

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

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

【问题讨论】:

  • ptr 未初始化,导致未定义行为。分段错误是一种可能的结果。不要那样做!
  • @l3x 为什么不将此作为问题的答案发布?如果您知道如何解决问题,那就更好了!
  • 下面的代码中没有cmets。
  • @underscore_d 我要求你对你的 cmets 加倍肯定。谢谢。

标签: c pointers segmentation-fault


【解决方案1】:

在您的代码中,

 printf("*ptrD %d\n", *ptrD);

ptrD 未初始化,它指向某个随机位置。效果:undefined behavior.

同样如此

*ptrD = 26;
printf("*ptrD %d\n", *ptrD);

也是。

也许你想要,(但错过了

ptrD = &var;

作为定义之后的下一个语句。

[P.S - 你应该庆幸的是,由于 UB,应用程序没有使用你的信用卡为你所有的同事订购披萨和小马。开个玩笑,一旦你打了 UB,什么都没有,绝对没有任何保证。]

【讨论】:

  • 这似乎不是问题
【解决方案2】:

您也应该在此代码中遇到分段错误..

您正在访问指针而不为其分配内存

//printf("*ptr %d\n", *ptr);
printf("*ptrD %d\n", *ptrD);

*ptrD 还没有被分配内存,所以它没有初始化,并且指向随机内存地址。访问它会给您带来分段错误。

【讨论】:

    【解决方案3】:

    这些指针是未初始化的,你取消引用它们最终会导致未定义的行为

    这些陈述-

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

    【讨论】:

    • 我不想使用堆
    • 那么你想做什么?还是您只是为了好玩而编写随机代码,然后在没有选择很酷的事情时抱怨?
    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多