在c中遍历数组时的分段错误

时间:2011-08-10 15:22:19

标签: c segmentation-fault

我在c:

中写了这个小函数
void initializeArray(char arr[ROWS][COLS]){
    int i,j;
    for (i=0; i<COLS; i++){
        for (j=0; j<ROWS; j++){
            arr[i][j] = ' ';
        }
    }
}

编辑:ROWS和COLS在头文件中定义

当我打电话给它时,我不断遇到分段错误。如果我使用遍历数组 指针没关系,任何想法为什么?

P.S。 传递的数组是在函数外部定义的,因此没有链接问题。

3 个答案:

答案 0 :(得分:10)

在您的函数声明中,您的第一个维度的大小为ROWS,第二个维度的大小为COLS;但是在您的函数体中,您在第一维上循环COLS次,在第二维上循环ROWS次。根据数组声明是否与函数声明或代码中的“隐含声明”匹配,这可能是一个问题。

答案 1 :(得分:6)

在函数声明中,使用char arr[ROWS][COLS]并在循环中使用arr作为arr[i][j],其中i用于循环到COLS和{ {1}}用于循环到j

您的ROWSCOLS在两种情况之间都会互换。

答案 2 :(得分:5)

你在循环中交换了ROWS和COLS。

表达式arr[i][j]相当于*(&arr[0][0] + COLS*i + j),由于交换,最后一次访问变为*(&arr[0][0] + COLS*(COLS - 1) + (ROWS - 1))

例如,如果COLS为100且ROWS为50,则访问的最后一个元素从开始起将是100 * 99 + 49 = 9949字节,但该数组仅为5000字节。以正确的方式翻转,最后一次访问变为100 * 49 + 99 = 4999,这是数组的最后一个字节。