我正在用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;
}
我可以根据需要提供更多信息。
答案 0 :(得分:1)
你有:
struct periodic *tablePtr = period_table;
这里,tablePtr
指向在函数中本地定义的数组。然后从函数返回tablePtr
。函数返回时,数组将被销毁。因此,调用函数有一个悬空指针。
引用悬空指针会导致未定义的行为。
您需要从堆中分配内存,返回指向动态分配内存的指针,并在调用函数中释放内存。
struct periodic *tablePtr = malloc(sizeof(*tablePtr)*num_elements);
并在main
中,致电
free(tablePtr);
在函数结束之前。
另外,向main
添加显式返回类型。
int main()
{
...
}