gpt4 book ai didi

c - 将指针传递给创建段错误的其他函数

转载 作者:太空宇宙 更新时间:2023-11-04 02:24:26 24 4
gpt4 key购买 nike

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

庆典$ !gcgcc 示例 2.c ; ./a.exe段错误(核心转储)

我试图在 pass() 函数中更新 a 的值,但一直出现段错误。不确定出了什么问题。寻找更正的代码! 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

相反。

顺便说一句:您不需要将双指针传递给函数。只需 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

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

关于c - 将指针传递给创建段错误的其他函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53313920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com