Нарушение прав доступа при чтении по адресу 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) и получаете неприятности.

Передавайте в функции правильные аргументы!

→ Ссылка