结构体中动态分配不同大小矩阵的代码报错求助
问题分析与修正
核心错误点
- 指针访问语法错误:
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
相关产品推荐
相关产品推荐

