【问题标题】:segmentation fault array float in ubuntu but not osx分段错误数组浮动在 ubuntu 但不是 osx
【发布时间】:2014-11-14 10:53:21
【问题描述】:

如果我在 osx 上使用 gcc 编译此代码并运行它,它会完美运行...确实,如果我在 ubuntu(gcc 版本:4.8.2)上编译相同的代码并运行它,我有一个分段故障错误。为什么?

#include <stdio.h>
#include <stdlib.h>

#define ROW 64
#define COL 16  

int readMyFile(float*, char**);

int main(int argc, char *argv[])
{
  float *array;
  array = (float*) malloc (ROW*COL*sizeof(float));

  r = readMyFile(array,argv);
  if(r) return r;

  free(array);

  return 0;
}


int readMyFile(float *array, char* argv[]) {

   FILE *ifp;
   float tmp;
   short i=0;

   ifp=fopen(argv[1], "r");

   if(ifp==NULL)
     return 1;

   while(fscanf(ifp, "%f", &tmp) == 1)
   {
      printf("i: %d\n",i);
      array[i]=tmp;
      i++;
   }
   fclose(ifp);
   return 0;
}

我在 Ubuntu 14.04 LTS 上使用命令编译上面的代码:gcc -o Test Test.c 之后,我使用以下命令运行:./Test myfile.txt

myfile.txt的内容是这样的:

-4 0 -3 -2 2 0 2 0 1 . . . 等等

在我看来,问题可能出在这一点上:matrix[i]=tmp; 为什么?

【问题讨论】:

  • 你打算如何限制array[i]中的i
  • 使用调试器,即 GDB。
  • @SouravGhosh,为什么需要在数组[i] 中限制“i”?
  • @GAM 否则,它可能会超出分配的内存,产生 UB,给出 segfault,导致疼痛......
  • 2000000 > 64*16 还有short i

标签: c arrays segmentation-fault malloc ubuntu-14.04


【解决方案1】:

有两个地方应该添加错误处理:

int main(int argc, char *argv[])
{
  float *array;
  array = (float*) malloc (ROW*COL*sizeof(float));

  // Added check that malloc succeded.
  if (array == NULL) return 1;  // Failed to allocate memory

  r = readMyFile(array,argv);
  if(r) return r;

  free(array);

  return 0;
}


int readMyFile(float *array, char* argv[]) {

   FILE *ifp;
   float tmp;
   int i=0;    // Change type to int to be able to handle larger sizes.

   ifp=fopen(argv[1], "r");

   if(ifp==NULL)  // Good!
     return 1;

   while(fscanf(ifp, "%f", &tmp) == 1)
   {
      // Added check that there is room in array.
      if (i >= ROW * COL) return 1;  // Too many values in the file!
      printf("i: %d\n",i);
      array[i]=tmp;
      i++;
   }
   fclose(ifp);
   return 0;
}

编辑:

显然该文件包含超过 64*16 的值,因此在这种情况下,由于文件中的值过多,代码将退出。

【讨论】:

  • 奇怪的是 osx 上面的程序在没有你添加的控件的情况下工作
  • @GAM:机会问题。超出分配给它的内存边界写入array 会产生未定义的行为。
  • @GAM:从语义上讲,我建议您将argv[1] 而不是argv 传递给函数readMyFile(float* array, char* fileName)
  • @GAM:另外,正如我在对您的问题的评论中已经提到的那样,在if(r) return r,您需要在return r 之前free(array)
  • @KlasLindbäck 我尝试使用您的更改运行代码......执行结束了文件第 1023 行的读取。还有其他几行?我如何继续阅读它们?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2021-11-26
  • 2020-06-20
  • 1970-01-01
  • 2021-08-19
相关资源
最近更新 更多