Помогите исправить ошибку в коде С
Необработанное исключение по адресу 0x00007FF612D25A22 в lab3.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000007757300008.
Ошибка при выполнении кода, которую я не понимаю так как чайник в данном деле пока.
void main(void) {
int r=1, r2=0, s, s2 = 0, arrey[5][5];
for (r = 1; r <= 5; r++) {
for (s = 1; s <= 5; s++) {
printf("Vvedit znachennya A%d,%d = ", r, s); scanf_s("%d", &arrey[r2][s2]);
s2 = s2 + 1;
};
s2 = 1;
s = 1;
r2 = r2 + 1;
printf(".\n");
};
int i=0, k=0, f, x, j, y;
j = 0; f = 0;
r2 = 0; s2 = 0;
while (i < 25) {
k = arrey[r2][s2];
for (r2 = 0; r2 < 5; r2++) {
if (r2 == 0) {
for (s2 = 0; s2 < 5; s2++) {
if (arrey[r2][s2] < k) arrey[r2][s2] = k; x = r2; y = s2;
};
}
else if (r2 == 1) {
for (s2 = 0; s2 < 5; s2++) {
if (arrey[r2][s2] < k) arrey[r2][s2] = k; x = r2; y = s2;
};
}
else if (r2 == 2) {
for (s2 = 0; s2 < 5; s2++) {
if (arrey[r2][s2] < k) arrey[r2][s2] = k; x = r2; y = s2;
};
}
else if (r2 == 3) {
for (s2 = 0; s2 < 5; s2++) {
if (arrey[r2][s2] < k) arrey[r2][s2] = k; x = r2; y = s2;
};
}
else if (r2 == 4) {
for (s2 = 0; s2 < 5; s2++) {
if (arrey[r2][s2] < k) arrey[r2][s2] = k; x = r2; y = s2;
};
};
};
arrey[x][y] = arrey[j][f];
arrey[j][f] = k;
if (f < 5) { f++; }
else { f = 0; j++; r2 = j; f = s2; };
};
for (r2 = 0; r2 < 5; r2++) {
printf("(");
for (s2 = 0; s2 < 5; s2++) {
printf("\'%d\'", arrey[r2][s2]);
};
printf(")\n");
};
system("pause");
};
Как я понял что-то, связано с массивом. Буду благодарен за помощь.
Ответы (1 шт):
s2 = 1;
Тут, по видимому, нужен был 0, иначе происходит попытка записи в arrey[r2][5]
while (i < 25) {
А где, собственно, меняется эта i?
arrey[x][y] = arrey[j][f];
arrey[j][f] = k;
Тут переменные индексов бывают >=5; выход за пределы массива.
Необходимо пересмотреть код, меняющий эти индексы.
if (f < 5) { f++; } // if (f+1 < 5) f++;
Проверяется валидность текущего значения, а не после инкремента.
В итоге f = 5 просачивается в индексы массива.
if (r2 == 0) {
Ввиду одинаковости тела всех этих if можно объединить под if (r2 < 5).
Так как это же условие проверяется в самом цикле, условие можно удалить.
if (arrey[r2][s2] < k) arrey[r2][s2] = k; x = r2; y = s2;
Обратите внимание на то, что условие относится только к первому оператору.
Добавьте фигурные скобки.
Как я бы описал подобный код(с учётом того, что я не стал разбираться в смысле «полезной» работы):
#include <stdio.h>
void input(int *arr, size_t N, size_t M) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
printf("Vvedit znachennya A%d,%d = ", i+1, j+1);
scanf("%d", &arr[i*M+j]);
};
printf("\n");
};
}
void doSomething(int *arr, size_t N, size_t M) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
arr[i*M + j] = (i+j) * arr[i*M + j];
};
};
}
void print(int *arr, size_t N, size_t M) {
for (int i = 0; i < N; i++) {
printf("[");
for (int j = 0; j < M; j++) {
printf("\'%d\'", arr[i*M+j]);
if (j < M - 1) {
printf(", ");
}
};
printf("]\n");
};
}
int main() {
size_t M, N;
scanf("%lu %lu", &M, &N);
int array[N][M];
input((int*)(array), N, M);
print((int*)array, N, M);
printf("Do something\n");
doSomething((int*)array, N, M);
print((int*)array, N, M);
};
// gcc -Wall 1204765.c -o 1204765 && ./1204765 <<< '3 3 1 2 3 1 2 3 1 2 3'