gpt4 book ai didi

C int 未存储

转载 作者:行者123 更新时间:2023-11-30 17:17:11 24 4
gpt4 key购买 nike

因此,此代码片段的目标是从表示多项式系数的文件中读取数字。事先并不知道数字的数量。每行有一个“多项式”。我正在阅读的文件示例如下。

Polynomails.txt
1 2 0 0 5
7.0 0 0 0 -2.25 1.13

当前 main 仅检查是否给出了文件名以及是否可以打开该文件,然后调用 ReadPoly,如下所示。 BUFFSIZE 通过此文件中的定义语句定义为 256。

void ReadPoly(FILE* InputFile){
polynomial poly;
double complex *coef;
char *p, *buffer;
unsigned int terms;

buffer = (char*) malloc(BUFFSIZE);

while(fgets(buffer,BUFFSIZE,InputFile)){
coef = (double complex*) malloc(BUFFSIZE*sizeof(double complex));
terms = 0;
p = strtok(buffer, " ");
while(NULL != p){
coef[terms] = atof(p);
terms++;
p = strtok(NULL, " ");
}
coef = (double complex*) realloc(coef,(terms*sizeof(double complex)));
printf("terms provided to init: %d\n",terms);
createPoly(&poly,terms);
poly.polyCoef = coef;
printf("terms in struct: %d\n",poly.nterms);
}
free(buffer);
}

这是 createPoly 函数和 Poly 结构的声明。

typedef struct
{
unsigned int nterms; /* number of terms */
double complex *polyCoef; /* coefficients */
} polynomial;


void createPoly(polynomial *p, unsigned int nterms){
double complex terms[nterms];

p = (polynomial*) malloc(sizeof(polynomial));

p->nterms = nterms;
p->polyCoef = terms;
printf("In createPoly, nterms: %d\n",p->nterms);
}

现在据我所知,所有数字都已正确读取,但结构中的 nterms 值未按预期工作。这是我运行此命令时的输出。值得一提的是,即使使用相同的文件输入,“结构中的术语”值也不总是相同。

terms provided to init: 6
In createPoly, nterms: 6
terms in struct: 1075624960
terms provided to init: 5
In createPoly, nterms: 5
terms in struct: 1075624960

我唯一的想法是,结构体的 polyCoef 字段以某种方式覆盖了 nterms 字段,但没有固定大小(这不是一个选项),我不确定如何继续。

最佳答案

ReadPoly函数中,您将poly声明为堆栈变量,这意味着编译器已经为堆栈上的结构分配了空间。

然后在 creatPoly 中,您将指针重新分配给您手动分配的其他内存,从而丢失了传递给 createPoly 的原始指针,因此您在结构中设置的数据仅为新分配的结构设置,而不是在传递给函数的原始结构中设置。这也意味着存在内存泄漏,因为一旦函数返回,您在 createPoly 中分配给的指针就会丢失。

有两种解决方案:要么不在createPoly中分配内存,要么让polyReadPoly中作为指针,然后传递一个指向指针的指针作为createPoly的参数(枚举按引用传递)。我建议第一个解决方案。

关于C int 未存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29458695/

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