I wrote some code and it showed me this error: Exception thrown at 0x00007FF93F57B016 (ucrtbased.dll) in Ficha 5.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

I can't find the reason behind it.

#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 Answers

1
VoteyDisciple On

You have:

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

This should be

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

Otherwise, i < m is going to be true forever (because you're not changing i in that loop) and you'll eventually be accessing 0xFFFFFFFFFFFFFFFF (the very edge of memory).

1
Community On

For memory errors like this a good idea is to use a memory checking tool (you can try valgrind memcheck). Now let's see what's wrong with your code :)

The array

You have to take into account that int[m][n] isn't the same as int**. Using the gcc compiler you'll get a warning about it. (Of course, you can alter your code to use int**)

The For Loop

Just as VoteyDisciple said you should be using

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

instead of

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

Uninitialized values

Creating an array and not initializing it can lead to memory errors later on (assuming we're talking about C - some languages initialize arrays with 0's). Here you create the x,y,z matrixes but you end up using a portion of them which you assign values to. The rest remain uninitialized and you can end up running into errors if you try accessing them later on.

The scanf exception

Really the exception you get is due to the above, as you're getting errors from trying to access the memory address at &matriz1[i][j]

Fixing it all

Here's how I'd write your code so that it works:

#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');
    }
}