Исключение, выданное в 0x00007FF93F57B016 (ucrtbased.dll) в Ficha 5.exe: 0xC0000005: место чтения нарушения доступа 0xFFFFFFFFFFFFFFFF - PullRequest
0 голосов
/ 13 мая 2019

Я написал некоторый код, и он показал мне эту ошибку: Исключение, выданное в 0x00007FF93F57B016 (ucrtbased.dll) в Ficha 5.exe: 0xC0000005: Место чтения нарушения доступа 0xFFFFFFFFFFFFFFFF.

Я не могу найти причину этого.

#include <stdio.h>
#define num 10

void ler_matriz(int **matriz1, int n, int m);
void mostrar_matriz(int matriz1[num][num], int n, int m);
//int num_min_matriz(int matriz1[][], int n, int m);
//void teste_simetria(int matriz1[][], int n, int m);
//void transposta_matriz(int matriz1[][], int n, int m);
//void soma_matriz(int matriz1[][], int matriz2[][], int matriz3[][], int n, int m);

int main()
{

    int x[num][num], y[num][num], z[num][num], numL, numC;

    printf("Introduza o número de linhas e colunas para a matriz:\n");
    scanf(" %d%d", &numL, &numC);

    printf("\n\nIntroduza os valores para a matriz 1:   ");
    ler_matriz(x, numL, numC);
    mostrar_matriz(x, numL, numC);


    return 0;
}



void ler_matriz(int **matriz1, int n, int m)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            printf("\nx[%d][%d]:    ", i + 1, j + 1);
            scanf(" %d", &matriz1[i][j]); // the exception error 
        }
    }
}

void mostrar_matriz(int matriz1[num][num], int n, int m)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; i < m; j++)
        {
            printf("%d     ", matriz1[i][j]);
        }
        putchar('\n');
    }
}

Ответы [ 2 ]

1 голос

Для ошибок памяти, подобных этой, хорошей идеей является использование инструмента проверки памяти (вы можете попробовать valgrind memcheck). Теперь посмотрим, что не так с вашим кодом :)

Массив

Вы должны принять во внимание, что int[m][n] - это не то же самое, что int**. Используя компилятор gcc, вы получите предупреждение об этом. (Конечно, вы можете изменить свой код, чтобы использовать int**)

Для цикла

Точно так же, как VoteyDisciple сказал, что вы должны использовать

for (int j=0;j<m;j++)

вместо

for(int j=0;i<m;j++)

Неинициализированные значения

Создание массива и его не инициализация могут привести к ошибкам памяти в дальнейшем (при условии, что мы говорим о C - некоторые языки инициализируют массивы с 0). Здесь вы создаете матрицы x,y,z, но в итоге вы используете ту часть, которой вы присваиваете значения. Остальные остаются неинициализированными, и вы можете столкнуться с ошибками, если попытаетесь получить к ним доступ позже.

исключение scanf

Действительно, вы получаете исключение из-за вышеизложенного, так как вы получаете ошибки при попытке доступа к адресу памяти в &matriz1[i][j]

Исправление всего этого

Вот как я бы написал ваш код, чтобы он работал:

#include <stdio.h>
#include <stdlib.h>
#define num 10

    void ler_matriz(int **matriz1, int n, int m);
    void mostrar_matriz(int** matriz1, int n, int m);
//int num_min_matriz(int matriz1[][], int n, int m);
//void teste_simetria(int matriz1[][], int n, int m);
//void transposta_matriz(int matriz1[][], int n, int m);
//void soma_matriz(int matriz1[][], int matriz2[][], int matriz3[][], int n, int m);

int main()
{

    //int x[num][num], y[num][num], z[num][num], numL, numC;
    int i,j,**x,**y,**z,numL,numC; //Proper declarations
    x=malloc(num*sizeof(int*));
    y=malloc(num*sizeof(int*));
    z=malloc(num*sizeof(int*));
    for(i=0;i<num;i++) {
        x[i]=malloc(num*sizeof(int));
        y[i]=malloc(num*sizeof(int));
        z[i]=malloc(num*sizeof(int));

    }
    //Initialization
    for(i=0;i<num;i++) {
        for(j=0;j<num;j++) {
            x[i][j]=y[i][j]=z[i][j]=0;
        }
    }
    printf("Introduza o número de linhas e colunas para a matriz:\n");
    scanf(" %d%d", &numL, &numC);
    printf("\n\nIntroduza os valores para a matriz 1:   ");
    ler_matriz(x, numL, numC);
    mostrar_matriz(x, numL, numC);
    for(i=0;i<num;i++) {
        free(x[i]);
        free(y[i]);
        free(z[i]);
    }
    free(x);
    free(y);
    free(z);
    return 0;
}



void ler_matriz(int **matriz1, int n, int m)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            printf("\nx[%d][%d]:    ", i + 1, j + 1);
            scanf(" %d", &matriz1[i][j]); 
        }
    }
}

void mostrar_matriz(int **matriz1, int n, int m)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            printf("%d     ", matriz1[i][j]);
        }
        putchar('\n');
    }
}
1 голос
/ 13 мая 2019

У вас есть:

    for (int j = 0; i < m; j++)

Это должно быть

    for (int j = 0; j < m; j++)

В противном случае, i < m будет вечно (потому что вы не измените i в этом цикле), и вы в конечном итоге получите доступ к 0xFFFFFFFFFFFFFFFF (самому краю памяти).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...