使用fscanf时的Segfault

时间:2016-09-16 20:00:19

标签: c file-io scanf

我目前正在尝试从文件中读取多个浮点数。当我只使用一个变量时,它工作正常,但保存到多个浮点数时会出现问题:

float r_testdata[3276334];
float i_testdata[3276334];
int e = 1;

FILE *fpI_i = fopen("/home/users/Documents/document.dat","r");

for(int i = 0; i < 3276334;i++) {
    e = fscanf(fpI_i,"%f %f",&r_testdata[i],&i_testdata[i]);
    if(e != 1) {
        fprintf(stderr,"Error reading file\n");
    }

}
fclose(fpI_i);

当fscans以2读取时,会发生段错误。这似乎是fscanf的格式化问题,但我没有看到问题是什么。我查看了类似问题的帖子,但尚未解决。

1 个答案:

答案 0 :(得分:2)

由于巨大的数组,您可能会出现堆栈溢出。如果它们位于如下函数中:

void foo(void)
{
    float r_testdata[3276334];
    float i_testdata[3276334];

堆栈太小而无法容纳它们,从而导致内存损坏和段错误。

你可以像以下一样使它们全球化:

float r_testdata[3276334];  // Declared outside the function
float i_testdata[3276334];

void foo(void)
{

或更好地使用malloc使用动态内存分配。像:

float *r_testdata = malloc(3276334 * sizeof(float));

当您完成r_testdata时,请记得致电free(r_testdata);

如@BLUEPIXY所述:

这一行错了:

if(e != 1) {

您正在尝试读取两个值,因此必须使用:

if(e != 2) {