我正在尝试从.tsv4文件中获取数据。每当代码运行时,它返回一个分段错误:11。代码的目标是将未知数字存储到数组中,而不知道文件中的数字量。我正在尝试访问的文件有92个浮点值,并且它正确存储它们。但它仍然会给出分段错误错误。我知道这是因为内存问题,只是不确定如何处理它
该文件似乎从第24行获得了分段错误
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int getFileInfo(const char *filename, float list[]);
int main(void)
{
float list[] = {0};
int size = getFileInfo("numbers.tsv4",list);
return 0;
}
int getFileInfo(const char *filename, float list[])
{
FILE* spData;
if((spData = fopen(filename, "r")) == NULL)
{
fprintf(stderr, "Error opening file %s.\n",filename);
exit(1);
}
int i = 0;
while(fscanf(spData, "%f", &list[i]) != EOF)
{
i++;
}
if (fclose(spData) == EOF)
{
fprintf(stderr, "Error closing file %s.\n", filename);
exit(2);
}
return i + 1;
}
答案 0 :(得分:1)
代码的目标是将未知数字存储到数组中 不知道文件中的数字量
为了使这个读取逐个浮动并在堆上分配数组。
写作时
float list[] = {0};
int size = getFileInfo("numbers.tsv4",list);
你在堆栈上分配一个带有一个值的数组,并且永远不会改变。
而是传递指向函数的指针,让函数操作该指针
float* list = NULL;
int size = getFileInfo("numbers.tsv4",&list);
在函数内部读取文件中的浮点值,并根据需要增加重新分配列表数组E.g。
int size = 10; // lets start with 10 values
int readFloats = 0; // number of floats read
*list = malloc(sizeof(float)*size);
...
if (readFloats > size)
{
float* tmp = realloc(*list, sizeof(float)*(size+10));
if ( tmp != NULL )
{
size += 10;
*list = tmp;
}
... put in the float
}
最后再次使用当前浮动数重新分配以获得正确的大小
tmp = realloc(*list, readCurrent*sizeof(float));
if ( tmp != NULL )
{
size = readCurrent;
*list = tmp;
}
...