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