gpt4 book ai didi

C 结构体指针数组 vs 结构体指针 malloc

转载 作者:行者123 更新时间:2023-11-30 17:19:14 25 4
gpt4 key购买 nike

作品:

struct data{
int val;
};

int main(void){
struct data *var[2];
(*var)->val = 6;
printf("%d\n", (*var)->val);
return 0;
}

段错误:

struct data{
int val;
};

int main(void){
struct data **var = malloc(3 * sizeof(struct data));
(*var)->val = 6; // <- crash
printf("%d\n", (*var)->val);
return 0;
}

有人可以解释为什么会出现段错误,并给我一个工作示例,对我可以理解的段错误代码进行最小的更改。

最佳答案

指针未经过 malloc,您正在取消引用无效指针,因为您的数组是指针数组,并且它的元素未指向有效内存。

试试这个

#include <stdio.h>
#include <stdlib.h>

struct data
{
int val;
};

int main(void)
{
struct data *var[2];
/* You need to malloc before dereferencing `var[0]` */
var[0] = malloc(sizeof(var[0][0]));
if (var[0] != NULL)
{
var[0]->val = 6;
printf("%d\n", var[0]->val);

free(var[0]);
}
return 0;
}

此外,使用 (*var)->val = 6 绝对不必要且令人困惑。

在第二种情况下,您也应该做几乎相同的事情,除了指针数组是指向指针数组的指针,因此也需要 malloc() ,所以您的第二个示例意外地工作,因为有足够的内存 malloc()ed 但它也是错误的,你应该这样做

#include <stdio.h>
#include <stdlib.h>

struct data
{
int val;
};

int main(void)
{
struct data **var;
var = malloc(2 * sizeof(var[0]));
if (var == NULL)
return -1;
/* You need to malloc before dereferencing `var[0]` */
var[0] = malloc(sizeof(var[0][0]));
if (var[0] != NULL)
{
var[0]->val = 6;
printf("%d\n", var[0]->val);

free(var[0]);
}
free(var);
return 0;
}

关于C 结构体指针数组 vs 结构体指针 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28927752/

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