动态内存分配后打印数组元素失败,程序无输出如何解决?
问题分析与解决
你的代码问题出在二级指针的动态内存分配方式错误,导致访问m[3][3]时触发非法内存访问,程序直接崩溃,因此没有输出。
错误原因
int **m 是指向指针的指针,用来表示二维数组时,需要先分配一个存储指针的数组,再给每个指针分配对应长度的int数组。而你直接malloc了10*10*sizeof(int)的内存并赋值给二级指针,这会导致后续m[3][3]的访问逻辑错误——m[3]会被当成指针去解引用,但它实际是一块普通int内存,属于非法内存操作,程序会直接终止。
另外你还漏掉了必要的头文件:#include <stdio.h>(用于printf)和#include <stdlib.h>(用于malloc),虽然Dev-C++可能默认包含,但这是不规范的写法。
正确写法1:使用二级指针分配二维数组
#include <stdio.h> #include <stdlib.h> int main(){ int **m; // 先分配10个指针的空间 m = malloc(10 * sizeof(int*)); if(m == NULL){ // 检查内存分配是否成功 printf("内存分配失败\n"); return 1; } // 给每个指针分配10个int的空间 for(int i = 0; i < 10; i++){ m[i] = malloc(10 * sizeof(int)); if(m[i] == NULL){ printf("内存分配失败\n"); // 释放已分配的内存,避免泄漏 for(int j = 0; j < i; j++){ free(m[j]); } free(m); return 1; } } m[3][3] = 3; printf("%d\n", m[3][3]); // 释放内存:先释放每个int数组,再释放指针数组 for(int i = 0; i < 10; i++){ free(m[i]); } free(m); return 0; }
正确写法2:用一维数组模拟二维数组(内存连续,更高效)
如果不需要指针数组的结构,可以直接分配一块连续内存,通过下标计算模拟二维访问:
#include <stdio.h> #include <stdlib.h> int main(){ int *m; // 分配10*10个int的连续内存 m = malloc(10 * 10 * sizeof(int)); if(m == NULL){ printf("内存分配失败\n"); return 1; } // 用「行号*列数 + 列号」计算一维下标,对应原二维数组的m[3][3] m[3*10 + 3] = 3; printf("%d\n", m[3*10 + 3]); free(m); return 0; }
额外提醒
- 每次
malloc后都要检查返回值是否为NULL,避免内存分配失败引发后续错误。 - 使用完动态分配的内存后必须调用
free,避免内存泄漏。 - 若要确保输出能及时显示,可在
printf中添加换行符\n,或者调用fflush(stdout)刷新输出缓冲区。
内容的提问来源于stack exchange,提问作者DesdreMBM
相关产品推荐
相关产品推荐

