结构的初始化 - C

Veridian Dynamics

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

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”中打印的正确值不同。

任何帮助将不胜感激。

用户2736738

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

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

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

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

所以代码将类似于

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没有提供错误处理。最好使用strtoletc. 那些提供更好的错误处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章