C中缺少数据的结构数组?

时间:2016-03-07 05:24:36

标签: c

我正在用C语言设计一个程序。该程序的一部分涉及从文件中读取与周期表及其元素相关的数据表,并将其放在一个结构中。

到目前为止,它运作得相当好。但是,出于某种原因,当我尝试显示数组时,一些元素不会显示,而是显示空白。但它确实在代码的早期出现。

的main.c

main()
{
    struct periodic *tablePtr;
    tablePtr = createTable();
    printf("%d\t",(tablePtr+90)//Prints "Pa" here as expected
    int i;
    for(i=0;i<num_elements;i++){
        printf("%d\t%s\n",i,(tablePtr+90)->sym);//Prints i, but then just blank.
    }


}

periodic.c(创建表格)

#include "periodic.h"
#include <stdio.h>

struct periodic *createTable(){

    char format[] ="%d\t%s[3]\t \
                         %s[20]\t%f\t \
                         %s[100]\t%f\t \
                         %d\t%f\t%d\t \
                         %d\t%d\t%s[20]\t \
                         %s[7]\t%s[17]\t \
                         %d\t%d\t%f\t \
                         %s[40]\n)";


    struct periodic period_table[num_elements];
    struct periodic *tablePtr = period_table;
    FILE *fp;
    fp = fopen("periodictable.csv","r");

    char buff[200];

    struct periodic *initPtr = tablePtr;
    while(fgets(buff,sizeof(buff),fp)){
        sscanf(buff,format,&(tablePtr->num),&(tablePtr->sym),&(tablePtr->name),&(tablePtr->weight),&(tablePtr->config),&(tablePtr->neg),&(tablePtr->ion_rad),&(tablePtr->vdW_rad),&(tablePtr->IE_1),&(tablePtr->EA),&(tablePtr->oxi_st),&(tablePtr->stn_st),&(tablePtr->melt),&(tablePtr->boil),&(tablePtr->dens),&(tablePtr->type));
        tablePtr++;
    }

    fclose(fp);
    return initPtr;

}

我可以根据需要提供更多信息。

1 个答案:

答案 0 :(得分:1)

你有:

struct periodic *tablePtr = period_table;

这里,tablePtr指向在函数中本地定义的数组。然后从函数返回tablePtr。函数返回时,数组将被销毁。因此,调用函数有一个悬空指针。

引用悬空指针会导致未定义的行为。

您需要从堆中分配内存,返回指向动态分配内存的指针,并在调用函数中释放内存。

struct periodic *tablePtr = malloc(sizeof(*tablePtr)*num_elements);

并在main中,致电

free(tablePtr);
在函数结束之前

另外,向main添加显式返回类型。

int main() 
{
   ...
}