C 分段错误数组在ubuntu中浮动,但在osx中不浮动

C 分段错误数组在ubuntu中浮动,但在osx中不浮动,c,arrays,segmentation-fault,malloc,ubuntu-14.04,C,Arrays,Segmentation Fault,Malloc,Ubuntu 14.04,如果我在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

如果我在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;
}
#包括
#包括
#定义第64行
#定义第16列
int readMyFile(float*,char**);
int main(int argc,char*argv[])
{
浮点*数组;
数组=(float*)malloc(ROW*COL*sizeof(float));
r=readMyFile(数组,argv);
if(r)返回r;
自由(数组);
返回0;
}
int readMyFile(浮点*数组,字符*argv[]){
文件*ifp;
浮动tmp;
短i=0;
ifp=fopen(argv[1],“r”);
如果(ifp==NULL)
返回1;
而(fscanf(ifp、%f、&tmp)==1)
{
printf(“i:%d\n”,i);
数组[i]=tmp;
i++;
}
fclose(ifp);
返回0;
}
我使用Ubuntu 14.04 LTS上的命令编译了上面的代码:
gcc-o Test.c
之后,我使用以下命令运行:
/testmyfile.txt

myfile.txt
的内容如下:

-四, 0 -3 -2 2. 0 2. 0 1. . . . 等等


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

有两个地方可以添加错误处理:

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,因此在这种情况下,由于文件中的值太多,代码将退出。

您计划如何限制
array[i]
中的
i
?使用调试器,即GDB。@SouravGhosh,为什么需要限制array[i]中的“i”?@GAM否则,它可能会溢出分配的内存,产生UB,给出segfault,会引起痛苦……2000000>64*16,还有
short i
奇怪的是,上面的程序在osx上运行时没有您拥有的控件added@GAM:机会的问题。写入
array
超出分配给它的内存边界会产生未定义的行为。@GAM:从语义上讲,我建议您将
argv[1]
而不是
argv
传递给函数
readMyFile(float*array,char*fileName)
@GAM:另外,正如我在对你的问题的评论中已经提到的,在
如果(r)返回r
,你需要
释放(数组)
返回r
@KlasLindbäck之前,我试图用你的更改运行代码。。。执行结束对文件第1023行的读取。其他线路呢?我如何继续阅读它们?