Ошибка сегментации при обходе массива в c - PullRequest
4 голосов
/ 10 августа 2011

Я написал эту маленькую функцию на 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 ]

10 голосов
/ 10 августа 2011

В объявлении вашей функции вы получите ROWS в качестве размера первого измерения и COLS в качестве размера второго измерения;но в теле функции вы зацикливаетесь COLS раза по первому измерению и ROWS раза по второму.В зависимости от того, соответствует ли объявление массива объявлению функции или «подразумеваемому объявлению» в коде, это может быть проблемой.

6 голосов
/ 10 августа 2011

В объявлении функции используйте have char arr[ROWS][COLS] и в своем цикле вы используете arr как arr[i][j], где i используется для цикла до COLS, а j используется для цикла до ROWS.

Ваши COLS и ROWS меняются местами в обеих ситуациях.

5 голосов
/ 10 августа 2011

Вы поменялись местами 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, что является последним байтом массива.

...