Ошибка массива из-за назначения размера

Zulfidin Khodzhaev спросил: 28 марта 2018 в 02:20 в: c

Я делаю и пример для класса программирования C:

#define xSize 2
#define ySize 3int x,y, a[xSize][ySize];
for (x=1; x<=xSize; x++){for (y=1; y<=ySize; y++){
a[x][y]=(x*x)+(y*y);}}for (x=1; x<=xSize; x++){for (y=1; y<=ySize; y++){
printf("a[%d][%d]= %d   ", x, y, a[x][y]);}}

Он дает ошибку, когда я пытаюсь скомпилировать в "Xcode-macOS"

Но когда я даю int x, y, a [xSize + 1] [ySize + 1] он компилируется отлично, почему это происходит?

2 ответа

Есть решение
Jonathan Leffler FLASH ответил: 28 марта 2018 в 03:27

Когда вы указываете a[xSize] и b[ySize]. Массив a может хранить до xSize значений, в то время как b может хранить до ySize значений. Однако это начинается от индекса 0 до xSize-1 и от 0 до ySize-1 в массивах a и b соответственно. Поэтому, когда вы используете цикл for, вы повторяете цикл с индексами от 1 до xSize, когда на самом деле массив ограничен максимальным индексом xSize-1.

Jonathan Leffler kishore ответил: 28 марта 2018 в 04:21

Индексирование массива начинается с 0. В цикле for вы выполняете итерацию с x = 1 & & х & л; = размер. Условия должны быть x = 0 & х < размер. То же самое относится ко всем измерениям массива.

Zulfidin Khodzhaev ответил: 28 марта 2018 в 02:39
Но пример, который я делаю конкретно, начинается с 1, а не 0
Jonathan Leffler ответил: 28 марта 2018 в 02:52
@ZulfidinKhodzhaev: Тогда ваш пример не закодирован ни для собственного C, ни для языка, производного от C (такого как C ++, Java, JavaScript, Go, C #,…). Если вы хотите закодировать алгоритм с массивами, основанными на 1, вам придется выделить больше места - +1 - чтобы заставить алгоритм работать практически без ошибок. У вас все еще могут быть проблемы. Было бы лучше переработать алгоритм для использования массивов на основе 0. И идиоматические циклы C для итерации по элементам массива используют обозначение for (int i = 0; i < max; i++) - используйте их и отклоняйтесь только тогда, когда это важно, и вы знаете, что делаете.
Zulfidin Khodzhaev ответил: 28 марта 2018 в 03:24
@JonathanLeffler. Большое спасибо. Теперь я понимаю.