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

动态内存分配后打印数组元素失败,程序无输出如何解决?

问题分析与解决

你的代码问题出在二级指针的动态内存分配方式错误,导致访问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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:32:38