C 分段错误数组在ubuntu中浮动,但在osx中不浮动
如果我在osx上用gcc编译这段代码并运行它,它会运行得非常好。。。事实上,如果我在ubuntu(gcc版本:4.8.2)上编译相同的代码并运行它,我就会出现分段错误。为什么?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
#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行的读取。其他线路呢?我如何继续阅读它们?