gpt4 book ai didi

c - 为什么在初始化结构时出现段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 00:30:42 25 4
gpt4 key购买 nike

搜索了一小时。我想我最好把问题贴在这里。

我简化了代码。段错误在函数 initMyStruct 中。

#include "stdlib.h"

typedef struct {
int * arr1;
int * arr2;
} myStruct;

void allocMyStruct (myStruct * a, int num) {
a = malloc(sizeof(myStruct));
a->arr1 = malloc(10*sizeof(int));
a->arr2 = malloc(10*num*sizeof(int));
}
void initMyStruct (myStruct * a, int num) {
int i;
for (i = 0; i < 10; i++) a->arr1[i] = 0;
for (i = 0; i < 10*num; i++) a->arr2[i] = -1;
}
void freeMyStruct (myStruct * a, int num) {
int i;
for (i = 0; i < 10; i++) free(a->arr1);
for (i = 0; i < 10*num; i++) free(a->arr2);
free(a);
}
int main (void) {
int num = 3;
myStruct * a;
allocMyStruct (a, num);
initMyStruct (a, num);
freeMyStruct (a, num);
return 1;
}

最佳答案

因为您没有保留指向新分配内存的指针,而是使用未初始化的指针并获得未定义的行为。

您将 a 变量传递给 allocMyStruct(),但该调用(与所有其他调用一样)按值,因此新值在函数内部分配给它不会影响 main()a 的值。

更改它以便 allocMyStruct() 返回 新的指针值,或者获取指向该指针的指针。我更喜欢前者,它更简洁并且使用函数返回值通常会产生更好的代码:

myStruct * allocMyStruct(int num)
{
myStruct *p;

if((p = malloc(sizeof *p +
10 * sizeof *p->arr1 +
10 * num * sizeof *p->arr2)) != NULL)
{
p->arr1 = (int *) (p + 1);
p->arr2 = p->arr1 + 10;
}
return p;
}

上面的代码还简化了内存分配,在一个大的 malloc() 调用中完成所有操作,然后将其“切片”为您实际需要的三个部分。

顺便说一下,如果 arr1 的大小总是 10,那么动态分配它就没有意义了,它应该只是 int arr1[10];结构声明。

关于c - 为什么在初始化结构时出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19765746/

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