c - C : buffer overflow? 中 fscanf 的段错误

标签 c segmentation-fault out-of-memory

我想读取一个包含“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. 检查代码中 fopenfscanf 的返回。

3.为了安全,在您的程序中初始化

关于c - C : buffer overflow? 中 fscanf 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32782585/

相关文章:

c - 在 C 中未正确创建信号量

c - 为什么会出现核心转储?

arrays - 数组导致 'system.outofmemoryexception'

java permgen 对于 Linux 上的 swing 应用程序内存不足,但在 Windows 上则不然

docker - Logstash无法理解的内存不足错误

c - 在 C 中,如何计算 unsigned long 的模数?

c - string.withCString 和 UnsafeMutablePointer(变异 : cstring) wrapped into a function

c - mktime 显示不一致的输出

c++ - pthread_join 期间的段错误

c - 将 memcpy 与 void 指针一起使用时出现段错误 - C