gpt4 book ai didi

c - 结构体初始化-C

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

我不明白为什么这不起作用:我有结构

typedef struct{
float* charge;
int length;
}Colas;

我想从另一个函数“bucle”初始化 main 中的“Colas”实例:

//From "length", compute "charge":
Colas* bucle(int length){
Colas* cola = malloc(sizeof(Colas));
cola->length = length;
float seed = 3.5;
int i;
for(i=0; i<length; i=i+1){
cola->charge[i] = seed/(i+1);
}
return cola;
}
int main(int argc, char* argv[]){
int length = atoi(argv[1]);//Here I extract the value from argv
Colas* cola;
cola = bucle(length);
printf("InMain: %f", cola->charge[0]);
}

最后打印给出的数字类似于“81239127637182637182”,与“bucle”中打印的正确值不同。

任何帮助将不胜感激。

最佳答案

现在您编辑的代码正在访问一些未初始化的值并尝试修改它 - 调用未定义的行为。

cola->charge = malloc(length * sizeof * cola->charge);

现在您已经为 length 个浮点变量分配了内存。并将分配的chunk的地址分配给cola->charge

如果您仔细观察,这里我们动态分配了内存,其生命周期超出了函数 bucle 的范围。因此,只要知道 block 的地址,就可以访问它,这就是这里所做的。

所以代码会是这样的

Colas* bucle(int length){
Colas* cola = malloc(sizeof *cola);
if( cola == NULL){
fprintf(stderr, "%s\n","Error in malloc" );
exit(1);
}

cola->length = length;
cola->charge = malloc(cola->length * sizeof * cola->charge);
if( cola->charge == NULL){
fprintf(stderr, "%s\n","Error in malloc" );
exit(1);
}
float seed = 3.5;
for(int i=0; i<length; i++){
cola->charge[i] = seed/(i+1);
}
return cola;
}

检查malloc的返回值。如果它失败并返回NULL,您在访问它时不会遇到错误。使用完动态分配的内存后,释放它。(使用 free())。

<小时/>

此外,atoi 不提供错误处理。最好使用 strtol 等。它们提供更好的错误处理。

关于c - 结构体初始化-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47619929/

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