Нарушение прав доступа при чтении по адресу 0x0000000000000000
Вот такая программа (в задании нужно сделать всё через функции).
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<locale.h>
#include<math.h>
void vvod(int A[10], int i) {
srand(time(NULL));
for (i = 0; i < 10; i++) {
*(A + i) = rand();
}
}
void vivod(int i, int A[10]) {
printf("Массив из 10 чисел:\n");
for (i = 0; i < 10; i++) {
printf("%d) %d\n", i + 1, *(A + i));
}
}
void raschot1(int i, int A[10]) {
for (i = 0; i < 10; i++) {
if (*(A + i) % 10 == 0)
printf("Число оканчивающиеся на 0 под номером: %d \n", i + 1);
}
}
void vvod2(int B[6][5], int b, int d) {
for (d = 0; d < 6; d++) {
for (b = 0; b < 5; b++) {
*(*(B + d) + b) = rand() % 10;
}
}
}
void vivod2(int B[6][5], int b, int d) {
printf("\nБаллы, которые набрали спортсмены в каждом виде спорта:\n");
for (d = 0; d < 6; d++) {
for (b = 0; b < 5; b++) {
printf("%d\t", *(*(B + d) + b));
}
printf("\n");
}
}
void raschot2(int B[6][5], int i, int j, int sum[6], int min, int max, int* mi, int* ma) {
for (i = 0; i < 6; i++) {
for (j = 0; j < 5; j++) {
*(sum + i) += *(*(B + i) + j);
}
if (*(sum + i) > *ma) *ma = *(sum + i);
if (*(sum + i) < *mi) *mi = *(sum + i);
}
printf("Количество баллов набранное спортсменом занявшим последнее место: %d\n", *mi);
printf("Количество баллов набранное спортсменом победителем: %d\n", *ma);
}
void main() {
setlocale(LC_ALL, ".1251");
int A[10], i = 0;
int B[6][5], b = 0, d = 0;
int j = 0, sum[6] = { 1 }, min = 100000, max = 0;
int* mi = &min;
int* ma = &max;
vvod(A, i);
vivod(i, A);
raschot1(i, A);
vvod2(B, b, d);
vivod2(B, b, d);
raschot2(i, sum, min, max, mi, ma, j, B);
getch();
}
И на этой строчке *(sum + i) += *(*(B + i) + j);. Выдаёт вот такое:
Необработанное исключение по адресу 0x00007FF7341C1D34 в ConsoleApplication1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000000000000000.
Хотя если делать всё просто в одной функции main, то всё работает.
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Конечно, С такое непотребство скомпилирует:
void raschot2(int B[6][5], int i, int j, int sum[6], int min, int max, int* mi, int* ma) {
...
int j = 0, sum[6] = { 1 }, min = 100000, max = 0;
...
raschot2(i, sum, min, max, mi, ma, j, B);
Но вы же вместо массива передаете целое число! Понятно, что при выполнении получается полная ерунда — вы обращаетесь по адресу 0 (значение переменной i) и получаете неприятности.
Передавайте в функции правильные аргументы!