我不明白为什么这不起作用:我有结构
typedef struct{
float* charge;
int length;
}Colas;
我想从另一个功能" bucle"中初始化一个" 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
浮点变量数量分配了内存。并将分配的块的地址分配给cola->charge
。
如果您仔细注意到,这里有动态分配的内存,其寿命超出了函数bucle
的范围。因此,您可以访问它,只要您知道块的地址,这就是在这里完成的。
,代码将像
一样Colas* bucle(int length){
Colas* cola = malloc(sizeof *cola);
if( cola == NULL){
fprintf(stderr, "%sn","Error in malloc" );
exit(1);
}
cola->length = length;
cola->charge = malloc(cola->length * sizeof * cola->charge);
if( cola->charge == NULL){
fprintf(stderr, "%sn","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
等。这些提供更好的错误处理。
程序的主要问题是缺乏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: %fn", 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