代码编译成功但运行崩溃,无法打印二维指针指向的结构体成员内容
你的代码问题分析与修复方案
咱们一步步拆解下导致代码崩溃、无法访问目标内存的核心问题:
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
相关产品推荐
相关产品推荐

