Ficha 5.exe中在0x00007FF93F57B016(ucrtbased.dll)引发的异常:0xC0000005:访问冲突读取位置0xFFFFFFFFFFFFFFFFFF

时间:2019-05-12 23:34:26

标签: c

我写了一些代码,它向我显示了此错误:Ficha 5.exe中在0x00007FF93F57B016(ucrtbased.dll)引发异常:0xC0000005:读取访问位置0xFFFFFFFFFFFFFFFFFF的访问冲突。

我找不到背后的原因。

#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 个答案:

答案 0 :(得分:1)

您有:

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

应该是

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

否则,i < m将永远是正确的(因为您不会在该循环中更改i),最终您将访问0xFFFFFFFFFFFFFFFFFF(内存的最边缘)。

答案 1 :(得分:1)

对于这样的内存错误,一个好主意是使用内存检查工具(您可以尝试valgrind memcheck)。现在,让我们看看您的代码出了什么问题:)

数组

您必须考虑到#include<iostream> using namespace std; class two; class one{ int sno; public: one() { sno=312; } friend two operator =(one,two); }; //b b1; b1=a.seatno; class two{ int seatno; public: two(){seatno=0; } friend two operator = (one,two); }; two operator = (one a1,two b1) { b1.seatno=a1.sno; return b1; } int main() { one a1; two b1; b1=a1; } int[m][n]不同。使用gcc编译器,您会收到关于它的警告。 (当然,您可以更改代码以使用int**

For循环

就像VoteyDisciple所说的那样,您应该使用

int**

代替

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

未初始化的值

创建数组而不进行初始化可能会导致稍后发生内存错误(假设我们在谈论C-某些语言使用0初始化数组)。在这里,您创建了for(int j=0;i<m;j++) 矩阵,但最终使用了分配值的部分矩阵。其余的未初始化,如果以后再尝试访问它们,可能会遇到错误。

scanf异常

您确实由于上述原因而获得了例外,因为您尝试访问x,y,z处的内存地址时遇到错误

全部解决

这是我编写您的代码以使其起作用的方式:

&matriz1[i][j]