因此,此代码段的目标是从表示多项式系数的文件中读取数字。数量未知。每行只有一个“多项式”。我在下面阅读文件的示例。

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


当前main仅检查给定的文件名并且可以打开它,然后调用ReadPoly,如下所示。 BUFFSIZE被定义为256,在此文件中带有define语句。

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中分配内存,要么让poly作为ReadPoly中的指针,然后将指向该指针的指针作为createPoly的参数传递(枚举按引用传递) 。我建议第一个解决方案。

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

10-11 22:06