C语言结构体中double pointer访问问题:代码运行无输出错误求助
代码问题排查
你这段代码运行无输出的核心原因是野指针访问触发程序崩溃,具体问题点如下:
- 二级指针内存分配逻辑错误
C语言的二级指针模拟二维数组时,需要分两步分配内存:- 先给第一维分配对应行数的
int*指针内存,每个指针指向一行的首地址 - 再给每一行的指针分配对应列数的
int类型内存,用于存储实际数值
你当前只完成了第一步的分配,且第一步分配时错误乘了列数,没有给第二维分配内存就直接赋值,属于非法访问内存,程序会直接崩溃退出,自然没有输出。
- 先给第一维分配对应行数的
- main函数写法不符合C标准
标准C规定main函数返回值为int类型,void main()是老旧的非标准写法,部分编译器会出现编译或运行异常。 - 内存释放不完全
二级指针的内存释放需要先逐行释放第二维内存,再释放第一维的指针数组,你只释放了第一维内存,会造成内存泄漏。
修正后的可运行代码
#include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct Matriks{ int jumlahBaris; int jumlahKolom; int** nilai; } Matriks, *Matriks2; int main(){ int i; Matriks A; A.jumlahBaris = 2; A.jumlahKolom = 3; // 第一步:分配第一维行指针内存,大小为行数 * int*字节数 A.nilai = (int **)malloc(A.jumlahBaris * sizeof(int*)); // 第二步:逐行分配第二维存储int的内存,大小为列数 * int字节数 for(i = 0; i < A.jumlahBaris; i++){ A.nilai[i] = (int*)malloc(A.jumlahKolom * sizeof(int)); } int x = 26; int y = 12; A.nilai[0][0] = x; A.nilai[0][2] = y; printf("%d\n", A.nilai[0][0]); printf("%d", A.nilai[0][2]); // 释放内存:先逐行释放第二维 for(i = 0; i < A.jumlahBaris; i++){ free(A.nilai[i]); } // 再释放第一维指针数组 free(A.nilai); return 0; }
内容的提问来源于stack exchange,提问作者MWA
相关产品推荐
相关产品推荐

