结构初始化 - C.

时间:2017-12-03 15:30:20

标签: c struct malloc

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

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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也没有提供错误处理。最好使用strtol等。这些可以提供更好的错误处理。

答案 1 :(得分:0)

该程序的主要问题是缺少charge的内存分配。您可能还想检查是否已分配内存。如果未分配内存,malloc将返回NULL.

这是正确分配的说明:

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

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

//From "length", compute "charge":
Colas* bucle(int length){
    //(compute charge)
    Colas* cola = malloc(sizeof(Colas));

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

    cola->length = length; 

    for (int i=0; i<length; i++)
    {
        cola->charge[i] = (float)i;

        printf("InBucle: %f\n", cola->charge[i]);
    }

    return cola;
}

int main(int argc, char* argv[]){
    int length = 3;

    Colas* cola;
    cola = bucle(length);

    for (int i=0; i<length; i++)
        printf("InMain: %f \n", cola->charge[i]);

    // remember to free memory
    free(cola->charge);
    free(cola);

 return 0;
}

输出:

InBucle: 0.000000
InBucle: 1.000000
InBucle: 2.000000
InMain: 0.000000 
InMain: 1.000000 
InMain: 2.000000