传递指向其他函数的指针会导致分段错误

时间:2018-11-15 06:54:12

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

 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的值,但始终会出现段错误。不知道出了什么问题。寻找更正的代码! TIA!

2 个答案:

答案 0 :(得分:2)

这里

 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

请注意指针值如何更改。

答案 1 :(得分:0)

通常,您正在做var = NULL;,在下一行中,您进行的是var2->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;
 }