Я сделал программу на C, которая включает в себя многомерные массивы (он печатает multidimensional array символов), чтобы немного пересмотреть, но я наткнулся на ошибку.
Мой ожидаемый результат программы:
. . . A . . . . .
Однако я получаю:
. . A //Not meant to be 'A' but rather a '.' A . . . . .
Мне интересно, как я получаю это дополнительное «A» в позиции [0] [2], и как я могу исправить эту проблему.
Вот мой код:
#include void initArray(char shape[][2]); main() { char shape[2][2]; int i, j; initArray(shape); shape[1][0] = 'A'; printf("%c\n%c\n%c\n", shape[0][0], shape[0][1], shape[0][2]); printf("%c\n%c\n%c\n", shape[1][0], shape[1][1], shape[1][2]); printf("%c\n%c\n%c\n", shape[2][0], shape[2][1], shape[2][2]); getchar(); } void initArray(char shape[][2]) { int i, j; for(i = 0; i < 3; i ++) { for(j = 0; j < 3; j++) { shape[i][j] = '.'; } } }
Большое спасибо = D
Поскольку вам нужно зацикливаться до < 2
поскольку shape
объявлена как shape[2][2]
for(i = 0; i < 2;i++) for(j = 0; j < 2; j++)
Это будет перебирать shape
в строке и столбцах 0-1
включительно включительно
Возможным способом было бы избежать многомерных массивов и использовать простые массивы. Затем вместо char shape[2][2];
вы заявляете
char shape[4];
и shape[2*i+j]
кода shape[2*i+j]
вместо shape[i][j]
. (BTW компилятор преобразует позже в первый).
Используйте отладчик (например, gdb
), чтобы узнать, имеют ли значения i
и j
значимые значения. И добавьте assert(i>=0 && i<2)
в соответствующих местах.
Помните, что массив объявлен char arr[4];
(например, моя shape
выше) принимает только индекс от 0 до 3 (т. е. 4-1), т. е. использует arr[0]
, ... arr[3]
или arr[i]
с интегралом i
между 0 и 3. Доступ к arr[4]
(или arr[17]
или arr[i+1]
когда i
равно 3) является неопределенным поведением (все может случиться по стандарту C, включая коллапс Вseleniumной, который будет стандартным). Эта конкретная ошибка довольно распространена и называется переполнением буфера . Он используется во вредоносных программах.