C - fprintf选择值的分段错误

时间:2015-01-20 01:23:43

标签: c

我有一段代码可以根据用户定义的网格大小计算坐标,并将它们打印到文本文件中。但是,当我运行程序时,我得到一个分段错误,但仅对于网格的值为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); 

1 个答案:

答案 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这样的分析工具,很难找到这样的错误。我强烈建议您花时间学习如何使用这样的工具,以便将来可以找到这些错误的来源。