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

结构体中动态分配不同大小矩阵的代码报错求助

问题分析与修正

核心错误点

  • 指针访问语法错误:v[0].**matrice是完全错误的写法,访问结构体中的二级指针应直接使用v[i].matrice,后续指针操作或索引需遵循C语言语法规范。
  • scanf参数错误:读取整数必须传入变量地址,原代码scanf("%d %d", v[i].linii, v[i].coloane);未加&,会触发未定义行为。
  • 变量名冲突:循环内的i与函数参数i重名,会覆盖参数值导致逻辑错误,需更换循环变量名。
  • 目标对象错误:原代码固定给v[0]分配内存,而函数参数是i,应针对v[i]操作,才能让不同索引的矩阵拥有不同尺寸。

修正后的代码

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

struct matrice_dinamica{
    int linii, coloane;
    int **matrice;
} v[100], aux;

void comanda_L_citire_matrice(int idx)
{
    // 传入变量地址,读取当前矩阵的行列数
    scanf("%d %d", &v[idx].linii, &v[idx].coloane);

    // 分配行指针数组
    v[idx].matrice = (int **)malloc(v[idx].linii * sizeof(int *));
    // 循环变量用j,避免和参数idx冲突
    for(int j = 0; j < v[idx].linii; j++){
        // 给每一行分配列内存
        v[idx].matrice[j] = (int *)malloc(v[idx].coloane * sizeof(int));
    }
}

额外说明

  • 调用comanda_L_citire_matrice(n)时,会为v[n]分配对应行列数的矩阵,每个v[n]可设置不同的linii和coloane,满足多矩阵尺寸各异的需求。
  • 程序结束前需手动释放内存避免泄漏,示例释放函数如下:
void elibereaza_matrice(int idx){
    for(int j=0; j<v[idx].linii; j++){
        free(v[idx].matrice[j]);
    }
    free(v[idx].matrice);
    v[idx].matrice = NULL;
    v[idx].linii = v[idx].coloane = 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:05:21