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

yot*_*moo 4 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] = ' ';
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ern*_*ill 10

在你的函数声明中,你得到ROWS的是第一个维度COLS的大小,以及第二个维度的大小; 但是在你的函数体中,你在COLS第一个维度上循环次数,在第二个维度上循环次数ROWS.根据数组声明是否与代码中的函数声明或"隐含声明"匹配,这可能是一个问题.

  • 数组声明如何影响这个? (2认同)

Veg*_*ger 6

在函数声明中使用has char arr[ROWS][COLS]和在你的循环中使用arras arr[i][j],where i用于循环直到COLSj用于循环直到ROWS.

COLSROWS两种情况之间都有交换.


Mar*_*tos 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,这是数组的最后一个字节.