You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言矩阵函数实现求助:create函数代码异常排查及修正

排查与修正矩阵创建函数的问题

嘿,我帮你梳理下这个create函数里的几个关键问题,正是这些问题导致它没法正常运行:

1. 第一层内存分配的类型错误

你在给*p分配内存时,用了sizeof(int),但实际上*p是int**类型,我们需要分配的是n个指向int数组的指针(即int*类型),而不是int类型的空间。在64位系统里,指针大小通常是8字节,int是4字节,这样分配的空间会不足,后续操作很容易触发越界错误。

修正方式:把sizeof(int)改成sizeof(int*)。

2. 循环中行指针的访问逻辑错误

循环里的*(p[i])完全搞错了访问路径!p是int***类型,p[i]表示的是从p这个指针的位置往后偏移i个int**大小的地址,这根本不是我们刚分配的二维数组的行指针。正确的做法是先通过*p拿到我们分配的二维数组首地址(int**类型),再访问它的第i个元素,也就是(*p)[i]。

3. 内存泄漏隐患(可选但重要)

如果某一行的calloc失败了,之前已经分配的内存没有被释放,会造成内存泄漏。所以在报错时需要先清理已分配的资源。

修正后的完整代码

#include <stdio.h>
#include <stdlib.h>

void create(int*** p, const int n) {
    // 分配第一层:n个int*指针的空间
    *p = (int**)calloc(n, sizeof(int*));
    if (*p == NULL) {
        printf("Error1: Failed to allocate row pointers\n");
        return;
    }

    int i;
    for (i = 0; i < n; i++) {
        // 分配第i行的n个int空间
        (*p)[i] = (int*)calloc(n, sizeof(int));
        if ((*p)[i] == NULL) {
            printf("Error2: Failed to allocate row %d\n", i);
            // 释放已分配的行和第一层指针
            for (int j = 0; j < i; j++) {
                free((*p)[j]);
            }
            free(*p);
            *p = NULL; // 避免外部使用野指针
            return;
        }
    }
}

这样修改后,函数就能正确创建n×n的二维矩阵了,还处理了内存分配失败时的资源清理问题,避免泄漏。

内容的提问来源于stack exchange,提问作者Rasuljon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:09:44