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

代码编译成功但运行崩溃,无法打印二维指针指向的结构体成员内容

你的代码问题分析与修复方案

咱们一步步拆解下导致代码崩溃、无法访问目标内存的核心问题:

1. 传值调用导致结构体成员根本没被修改

你的mamal函数用的是值传递——传入主函数的matrx1时,函数会创建一个它的副本,你在函数里给matrix1.members赋值,修改的只是这个副本的成员,主函数里的原结构体matrx1的members还是未初始化的野指针,这必然会引发崩溃。

解决办法是改成传指针,让函数直接操作原结构体的内容。

2. 拼写错误引发的越界访问

主函数循环里写的i<matrx1.clnm是笔误,正确应该是matrx1.clmn。拼写错误会让程序读取到随机值,进而触发数组越界。

3. 二维数组的维度逻辑搞反了

结构体里line是行数、clmn是列数,但你在mamal里先分配了matrix1.clmn个int*(相当于按列数分配行指针),每个指针又指向matrix1.line个int,这和后续循环的逻辑完全颠倒,会导致访问越界。正确逻辑应该是:先分配line个行指针,每个行指针指向clmn个int元素。

4. 未检查内存分配是否成功

calloc在内存不足时会返回NULL,如果直接使用空指针会直接崩溃,所以最好加上分配成功的检查。


修正后的完整代码

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

typedef struct { 
    int **members; 
    int line;    // 行数
    int clmn;    // 列数
} matrix; 

// 修改为传指针,直接操作原结构体
void mamal(matrix *matrix1) { 
    // 先分配行指针数组,数量是行数line
    int **m = calloc(matrix1->line, sizeof(int*));
    if (m == NULL) {
        printf("内存分配失败!\n");
        exit(1);
    }

    int i; 
    for(i=0; i < matrix1->line; i++) { 
        // 每行分配clmn个int的空间
        m[i] = calloc(matrix1->clmn, sizeof(int));
        if (m[i] == NULL) {
            printf("内存分配失败!\n");
            exit(1);
        }
    } 
    // 给原结构体的members赋值
    matrix1->members = m; 
} 

int main (int argc, const char * argv[] ){ 
    matrix matrx1; 
    printf("Enter Column:"); 
    scanf("%d", &matrx1.clmn); 
    printf("Enter Line:"); 
    scanf("%d", &matrx1.line); 

    // 传入结构体指针
    mamal(&matrx1); 

    int i,j; 
    // 外层循环是行数line,内层是列数clmn
    for(i=0; i < matrx1.line; i++) { 
        for(j=0; j < matrx1.clmn; j++) { 
            // calloc会把内存初始化为0,所以这里会输出0
            printf("[%d][%d]:%d ", (i+1), (j+1), matrx1.members[i][j]); 
        }
        printf("\n"); // 每行结束换行,更易读
    } 

    // 记得释放内存,避免内存泄漏
    for(i=0; i < matrx1.line; i++) {
        free(matrx1.members[i]);
    }
    free(matrx1.members);

    return 0; 
}

额外提醒

  • 用完动态分配的内存后一定要记得释放,避免内存泄漏,我在修正后的代码里加上了释放逻辑。
  • calloc会自动把分配的内存初始化为0,如果你需要自定义值,可以在循环里给matrx1.members[i][j]赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:07:59