【问题标题】:*pointer was nullptr* error in C programming*指针在 C 编程中为 nullptr* 错误
【发布时间】:2018-01-02 19:47:28
【问题描述】:

我有一个严重的问题。

在线**c = (int*)malloc(size1 * sizeof(int*)); 编译器给了我这个错误,我真的不知道它在说什么。

抛出未处理的异常:读取访问冲突。
c 为 nullptr。发生了

我不知道我做错了什么.. 我像这样初始化每个指针。

void BuildMatrix(int ***, int, int);
void FreeMatrix(int ***, int);
void PrintMatrix(int **, int, int);
int **MultiplyMatrixes(int **, int**, int, int, int);

int main() {
    int **matrix1 = NULL, **matrix2 = NULL, **matrix3 = NULL;
    int * newCol = NULL;
    int size1, size2, size3, newRow;

    printf("-How many rows in the first matrix?: ");
    scanf("%d", &size1);
    printf("-How many columns in the first matrix and second?[size2, size3]: ");
    scanf("%d %d", &size2, &size3);  /*size2 = rows of matrix2.*/

    /*Build both matrices*/
    printf("-First matrix input.\n");
    BuildMatrix(&matrix1, size1, size2);
    PrintMatrix(matrix1, size1, size2);
    printf("-Second matrix input.\n");
    BuildMatrix(&matrix2, size2, size3);
    PrintMatrix(matrix2, size2, size3);

    /*Combine the 2 matrices to a new matrix*/
    matrix3 = MultiplyMatrixes(matrix1, matrix2, size1, size2, size3);
    FreeMatrix(&matrix2, size2); //Free the second matrix

    printf("\n-Multiplied matrix: \n");
    PrintMatrix(matrix3, size1, size3);

    FreeMatrix(&matrix3, size1);
    FreeMatrix(&matrix1, size1);
}
void BuildMatrix(int *** pMat, int row, int col) {
    int i, j;
    (*pMat) = (int **)malloc(row * sizeof(int*));
    if (*pMat == NULL) {
        free(pMat);
        printf("*Not enough RAM.\nTerminating.\n");
        exit(1);
    }
    for (i = 0; i < row; i++) {
        (*pMat)[i] = (int *)malloc(col * sizeof(int*));
        if ((*pMat)[i] == NULL) {
            printf("*Not enough RAM.\nTerminating.\n");
            FreeMatrix(pMat, row);
            exit(1);
        }
        for (j = 0; j < col; j++) {
            printf("-Enter %d element in %d row: ", j + 1, i + 1);
            scanf("%d", &(*pMat)[i][j]);
        }
        printf("\n");
    }
    //FreeMatrix(pMat, row);
}
void PrintMatrix(int ** pMat, int row, int col) {
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            printf("%d ", pMat[i][j]);
        }
        printf("\n");
    }
}
int** MultiplyMatrixes(int ** a, int ** b, int size1, int size2, int size3) {
    int i, j, k, **c = NULL;
    **c = (int*)malloc(size1 * sizeof(int*));
    if (c == NULL) {
        free(*c);
        printf("*Not enough RAM.\nTerminating.\n");
        exit(1);
    }
    for (i = 0; i < size1; i++) {

        for (j = 0; j < size3; j++) {
            c[i] = (int *)malloc(size3 * sizeof(int));
            if (c[i] == NULL) {
                printf("*Not enough RAM.\nTerminating.\n");
                FreeMatrix(&c, size1);
                exit(1);
            }
            for (k = 0; k < size2; k++) {
                c[i][j] += (a[i][k] * b[k][j]);
            }
        }
    }
    return c;
}

【问题讨论】:

  • 您真的很想改掉将“内存不足”代码存入每个分配调用的习惯。这将使您的代码因大量此类内容而变得混乱。如果您担心分配失败,请编写一个宏来执行此操作,这样您就可以在一个地方测试失败,而不是数十、数百甚至数千个独立的实例。
  • 从简单性和性能角度考虑的另一件事是将矩阵数据存储为一维数组并模拟其他维度。 16 元素数组比 4 元素指针数组加上额外的 4 乘以 4 元素数组更有效。从缓存的角度来看,第二层元素可以被分配到所有地方。
  • 这是很多代码来找到一个小错误。请花点时间提供minimal reproducible example。另外,不要强制转换 malloc。你不需要。
  • 谢谢你的建议。 @klutt,@tadman
  • c 是一个指向 int 的指针。由于c被初始化为null,那么*c会抛出异常。目前尚不清楚您实际上要如何处理该分配。

标签: c pointers nullptr


【解决方案1】:
(*pMat)[i] = (int *)malloc(col * sizeof(int*));

将会

(*pMat)[i] = malloc(col * sizeof(int));

您已为col 数量的int* 分配空间,您正在阅读int-s。

还有

**c = (int*)malloc(size1 * sizeof(int*));

将会

c = malloc(size1 * sizeof(int*));

否则,您试图取消引用 NULL 值,而 触发了您遇到的错误

循环也是

for (i = 0; i < size1; i++) {
    c[i] = malloc(size3 * sizeof(int));
    if (c[i] == NULL) {
        printf("*Not enough RAM.\nTerminating.\n");
        FreeMatrix(&c, size1);
        exit(1);
    }

    for (j = 0; j < size3; j++) {
        c[i][j]=0;
        for (k = 0; k < size2; k++) {
            c[i][j] += (a[i][k] * b[k][j]);
        }
    }
}

不要转换malloc的返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 2023-03-11
    • 2020-01-17
    • 1970-01-01
    • 2013-07-06
    • 2013-10-09
    • 2022-01-11
    • 2022-01-17
    相关资源
    最近更新 更多