c-将指针传递到其他函数,从而在故障时创建分段


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$!gcgcc sample2.c/a.exe分段故障(堆芯转储(

我正试图在pass((函数中更新a的值,但不断出现seg错误。不确定出了什么问题。正在查找已更正的代码!TIA!

此处为

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

相反。

BTW:您不需要向函数传递双指针。只需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

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

在main中,您正在执行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;
}

最新更新