我有一段代码可以根据用户定义的网格大小计算坐标,并将它们打印到文本文件中。但是,当我运行程序时,我得到一个分段错误,但仅对于网格的值为5或7,所有其他值都按预期工作。
代码如下
// Writing OUTPUT 1 to file
// Creating & opening file
FILE *f1 = fopen("coords_output.txt", "w");
if(f1 == NULL)
{
printf("Error in opening file\n");
exit(0);
}
// Writing to file
for(i=0; i < arrayLength; i++)
{
for(j=0; j < arrayLength; j++)
{
fprintf(f1, "\n%d,%d %d", i, j, coordArray[i][j]);
}
}
// Close file
fclose(f1);here
如果删除了//写入文件的整个部分,程序就会起作用,无论我放在哪里,程序都会失败。
我对c没有很好的理解,特别是涉及到这样的领域,但是我花了很多时间试图解决这个问题并且似乎无法得到答案。
编辑: coordArray定义为
coordArray = malloc(arrayLength * sizeof(int *));
for(i=0; i <= arrayLength; i++)
{
coordArray[i] = malloc(arrayLength * sizeof(int));
}
arrayLength取自用户输入
validInput = validInput && sscanf(argv[1], "%d", &arrayLength);
答案 0 :(得分:0)
此代码不起作用(根据您提供的代码进行修改):
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int arrayLength = 5;
int i,j;
int **coordArray;
coordArray = malloc(arrayLength * sizeof(int *));
for(i=0; i <= arrayLength; i++)
{
coordArray[i] = malloc(arrayLength * sizeof(int));
}
for(i=0; i < arrayLength; i++)
{
for(j=0; j < arrayLength; j++)
{
printf("\n%d,%d %d", i, j, coordArray[i][j]);
}
}
return 0;
}
它不起作用,因为第一个for
循环访问超出数组末尾的1。即使它似乎有效,但无论arrayLength
的值如何,代码都会被破坏。它可能适用于某些值的原因是由于分段错误的发生方式,因特网上有大量关于它们何时以及为何发生的资源,这里的random one似乎可以很好地解释它。
此代码有效(请注意第一个<=
循环中从<
到for
的更改):
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int arrayLength = 5;
int i,j;
int **coordArray;
coordArray = malloc(arrayLength * sizeof(int *));
for(i=0; i < arrayLength; i++)
{
coordArray[i] = malloc(arrayLength * sizeof(int));
}
for(i=0; i < arrayLength; i++)
{
for(j=0; j < arrayLength; j++)
{
printf("\n%d,%d %d", i, j, coordArray[i][j]);
}
}
return 0;
}
如果不使用调试器或像Valgrind这样的分析工具,很难找到这样的错误。我强烈建议您花时间学习如何使用这样的工具,以便将来可以找到这些错误的来源。