【问题标题】:Passing pointers to other function creating segmentaion fault将指针传递给创建分段错误的其他函数
【发布时间】:2018-11-15 06:54:12
【问题描述】:
 struct temp {
     int a;
 };
 int pass(struct temp **); //passing var
 int pass(struct temp ** var1) { //passing var
     (* var1)->a = 100;
     return 0;
 };
 int main() {
     struct temp * var2 = NULL;
     var2->a = 10;
     printf("\nbefore pass var2->a = %d", var2->a);
     pass(&var2);
     printf("\nafter pass var2->a = %d", var2->a); 
     return 0;
 }

bash$ !gc gcc sample2.c ; ./a.exe 分段错误(核心转储)

我正在尝试在 pass() 函数中更新 a 的值,但不断出现 seg 错误。不知道出了什么问题。寻找更正的代码!蒂亚!

【问题讨论】:

    标签: c pointers pass-by-reference pass-by-value double-pointer


    【解决方案1】:

    这里

     struct temp * var2 = NULL;
    

    您创建一个指向struct temp 的指针并将其初始化为NULL。它只是一个指针 - 没有没有任何内存用于struct temp

    然后你做:

    var2->a = 10;
    

    这意味着您取消引用 NULL 指针。那将失败。

    试试这个:

    struct temp * var2 = malloc(sizeof *var2);  // Create pointer and allocate 
                                                // memory for a struct temp
    

    改为。

    顺便说一句:您不需要将双指针传递给函数。只需int pass(struct temp *); 即可。

    所以完整的代码可以是:

    #include <stdio.h>
    #include <stdlib.h>
    
     struct temp {
         int a;
     };
    
     int pass(struct temp *); //passing var
     int pass(struct temp * var1) { //passing var
         var1->a = 100;
         return 0;
     };
    
     int main() {
         struct temp * var2 = malloc(sizeof *var2);
         var2->a = 10;
         printf("\nbefore pass var2->a = %d", var2->a);
         pass(var2);
         printf("\nafter pass var2->a = %d", var2->a); 
         free(var2);
         return 0;
     }
    

    只有当你想在 main 中更改 var2 的值时,才需要在这样的代码中传递双指针。例如,如果函数应该分配更多内存(即更多 struct temp 元素)。

    可能是这样的:

    #include <stdio.h>
    #include <stdlib.h>
    
     struct temp {
         int a;
     };
    
     int pass(struct temp **);
     int pass(struct temp ** var1) {
         free(*var1);                         // Free previous allocation
         *var1 = malloc(20 * sizeof **var1);  // Allocate 20 struct temp
         (*var1)[0].a = 100;
         (*var1)[1].a = 200;
         return 0;
     };
    
     int main() {
         struct temp * var2 = malloc(sizeof *var2);  // Allocate 1 struct temp
         var2->a = 10;
         printf("\npointer before pass var2 = %p", (void*)var2);
         printf("\nbefore pass var2[0].a = %d", var2[0].a);
         // printf("\nbefore pass var2[1].a = %d", var2[1].a);  // ILLEGAL HERE
    
         pass(&var2);
    
         printf("\npointer after pass var2 = %p", (void*)var2);
         printf("\nafter pass var2[0].a = %d", var2[0].a); 
         printf("\nafter pass var2[1].a = %d", var2[1].a);   // LEGAL HERE
    
         free(var2);
         return 0;
     }
    

    可能的输出:

    pointer before pass var2 = 0x563d28afa010
    before pass var2[0].a = 10
    pointer after pass var2 = 0x563d28afb040
    after pass var2[0].a = 100
    after pass var2[1].a = 200
    

    注意指针的值是如何变化的。

    【讨论】:

    • 好的,所以问题是缺少堆内存分配。谢谢。但我正在学习熟悉使用双指针传递,所以请在这种情况下解释。
    • 谢谢。正是我想要的。最后一个查询。 printf("\n在传递之前 var2[0].a = %d", var2[0].a); a”运行您的代码。
    • @kmP 你问:“指针变量和数组是否相互关联?”嗯,是。写法:*somePointersomePointer[0] 相同,*(somePointer + 5)somePointer[5] 相同另见stackoverflow.com/questions/4622461/…
    【解决方案2】:

    在 main 中,您正在执行 var = NULL;,而在下一行中,您正在执行 var2-&gt;a = 10;,这意味着您正在尝试将值分配给 var 指向的结构,但 var 尚未指向任何结构。

    也许你想做的是:

     struct temp {
         int a;
     };
     int pass(struct temp *); //passing var
     int pass(struct temp * var1) { //passing var
         var1->a = 100;
         return 0;
     };
     int main() {
         struct temp var2;
         var2.a = 10;
         printf("\nbefore pass var2->a = %d", var2.a);
         pass(&var2);
         printf("\nafter pass var2->a = %d", var2.a); 
         return 0;
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多