【发布时间】:2017-04-07 03:34:41
【问题描述】:
我正在尝试使用名为data.txt 的文件填充数组。我不知道代码有什么问题。我得到分段错误:11 错误。
#include <stdio.h>
#include <stdlib.h>
void input(int arr[]){
FILE* f;
int x, i=0;
f= fopen("data.txt","r");
while (arr[i] != EOF){
fscanf(f,"%d",&x);
arr[i] = x;
i++;
}
fclose(f);
}
int main(){
int arr[50];
input(&arr[50]);
printf("%d", arr[0]);
}
【问题讨论】:
-
arr[i]永远不会等于EOF,因此您将永远循环并最终出现段错误。您还将数组末尾的第一个元素的地址传递给input(),因此您尝试写入从一开始就不属于您的内存。 -
input(&arr[50])应该是input(arr) -
在使用文件指针之前,你没有检查你是否成功打开了输入文件。这是导致崩溃的一个简单原因(并且很容易修复 - 始终检查来自
fopen()或任何其他类似打开的函数的返回值)。您不检查来自fscanf()的返回值;这也是一个错误。 (见How do we check the return values fromscanf()?) -
语句:
while (arr[i] != EOF)在循环的每次迭代中都在查看arr[]中尚未初始化的条目!建议将while()和下一条语句替换为:while( 1 == fscanf(f,"%d",&x) )并且循环对可以读取的整数数量没有限制,但实际数组仅声明了 50 个条目,因此 while() 语句应该是:while( i<50 && 1 == fscanf(f,"%d",&x) ) -
在 C 中,数组偏移量/索引从 0 开始并持续到(数组的长度 -1),并且此语句:
input(arr[50]);正在传递(数组末尾之后的值) ) 到函数input()。该行应为:input(arr);