C 中 fscanf 的分段错误:缓冲区溢出?
Segmentation fault with fscanf in C : buffer overflow?
我想读取一个包含“100 万”行 9 列的文件。如果文件最多包含 200,000 行,程序运行良好,否则我会看到以下错误:
分段错误:核心已转储
错误退出代码:139
问题是我想读取文件以便我可以读取不同列中的值,因此,我不能使用 "fgets" 来扫描整行。我找不到解决这个问题的好方法,我能得到一些帮助吗?
这是我的程序的快照(省略了 "y" 的定义(如下所示)):
int main(){
int number=290000;
int k,u,i,n = 10000;
float ns_ux[number], ns_uy[number], ns_uz[number], xn[number], yn[number], zn[number];
float l[number],b[number], ns[number], xf,x0,step,s;
FILE *fp=NULL;
fp=fopen("File_new.txt","w");
printf("Enter x0, xf, no. of subintervals: ");
scanf("%f%f%d",&x0, &xf,&n);
FILE* val= NULL;
printf("k xn yn zn int_val tau \n");
val=fopen("file.txt", "r");
for(u=0;u<=(number-1);u++){
fscanf(val,"%f %f %f %f %f %f %f %f %f", &xn[u], &yn[u], &zn[u], &ns_ux[u], &ns_uy[u], &ns_uz[u], &l[u], &b[u], &ns[u]);// \t is tab
}
for(k=0;k<=(number-1);k++){
step = (xf-x0)/n;
s = y(x0,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k], l[k], b[k], ns[k]) + y(xf,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k],l[k], b[k], ns[k]);
for(i = 1; i < n; i++){
s += 2*y(x0+i*step,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k], l[k], b[k], ns[k] );
}
int_val = s*step/2;
fprintf(fp,"%f\t%f\t%1.7f\t%f\n",l[k],b[k],fabs(int_val),ns[k]);
}
fclose(fp);
return 0;
}
int number=290000;
float ns_ux[number], ns_uy[number], ns_uz[number], xn[number], yn[number], zn[number];
堆栈上有 290000
个元素的数组可能会导致问题。您应该使用 malloc
.
在堆上分配内存
float *ns_ux;
ns_ux=malloc(sizeof(float)*290000); // like this for all and check its return
注意-
1.你有很多数组,所以分配free
每个数组后可能会导致内存泄漏。
2. 检查代码中 fopen
和 fscanf
的 return。
3. 为了安全起见,在您的程序中初始化 s
。
由于这些数组是在堆栈上创建的,您可以尝试执行 ulimit -s unlimited
以设置 "unlimited" 堆栈大小
你应该像之前说的那样使用malloc并保护它。
float *arr;
arr = (float *)malloc(sizeof(float) * 290000)
if (!arr)
{
printf("error malloc");
exit(0);
}
别忘了免费!
我想读取一个包含“100 万”行 9 列的文件。如果文件最多包含 200,000 行,程序运行良好,否则我会看到以下错误:
分段错误:核心已转储
错误退出代码:139
问题是我想读取文件以便我可以读取不同列中的值,因此,我不能使用 "fgets" 来扫描整行。我找不到解决这个问题的好方法,我能得到一些帮助吗?
这是我的程序的快照(省略了 "y" 的定义(如下所示)):
int main(){
int number=290000;
int k,u,i,n = 10000;
float ns_ux[number], ns_uy[number], ns_uz[number], xn[number], yn[number], zn[number];
float l[number],b[number], ns[number], xf,x0,step,s;
FILE *fp=NULL;
fp=fopen("File_new.txt","w");
printf("Enter x0, xf, no. of subintervals: ");
scanf("%f%f%d",&x0, &xf,&n);
FILE* val= NULL;
printf("k xn yn zn int_val tau \n");
val=fopen("file.txt", "r");
for(u=0;u<=(number-1);u++){
fscanf(val,"%f %f %f %f %f %f %f %f %f", &xn[u], &yn[u], &zn[u], &ns_ux[u], &ns_uy[u], &ns_uz[u], &l[u], &b[u], &ns[u]);// \t is tab
}
for(k=0;k<=(number-1);k++){
step = (xf-x0)/n;
s = y(x0,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k], l[k], b[k], ns[k]) + y(xf,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k],l[k], b[k], ns[k]);
for(i = 1; i < n; i++){
s += 2*y(x0+i*step,xn[k],yn[k], zn[k], ns_ux[k], ns_uy[k], ns_uz[k], l[k], b[k], ns[k] );
}
int_val = s*step/2;
fprintf(fp,"%f\t%f\t%1.7f\t%f\n",l[k],b[k],fabs(int_val),ns[k]);
}
fclose(fp);
return 0;
}
int number=290000;
float ns_ux[number], ns_uy[number], ns_uz[number], xn[number], yn[number], zn[number];
堆栈上有 290000
个元素的数组可能会导致问题。您应该使用 malloc
.
float *ns_ux;
ns_ux=malloc(sizeof(float)*290000); // like this for all and check its return
注意-
1.你有很多数组,所以分配free
每个数组后可能会导致内存泄漏。
2. 检查代码中 fopen
和 fscanf
的 return。
3. 为了安全起见,在您的程序中初始化 s
。
由于这些数组是在堆栈上创建的,您可以尝试执行 ulimit -s unlimited
以设置 "unlimited" 堆栈大小
你应该像之前说的那样使用malloc并保护它。
float *arr;
arr = (float *)malloc(sizeof(float) * 290000)
if (!arr)
{
printf("error malloc");
exit(0);
}
别忘了免费!