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

多维可变长数组打印异常:动态分配数组长度计算错误修复

问题分析与修复方案

你的判断完全正确,问题就出在int len = sizeof(a[i].row)/sizeof(a[i].row[0]);这行代码上。在C语言中,a[i].row是指针类型,sizeof(a[i].row)得到的是指针本身的字节数(比如64位系统下为8字节),而非它指向的数组总字节数。用这个值除以sizeof(a[i].row[0])(4字节),结果固定为2,因此第一行的第三个元素无法被打印。

要解决这个问题,必须在结构体中额外存储每行的长度信息——因为动态分配的数组无法通过指针直接获取其长度。

修正后的完整代码

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>

// 修改结构体,新增成员存储每行元素个数
struct Array {
    uint32_t* row;
    size_t row_len; // 记录当前行的元素数量
};

int main()
{
    struct Array* a = malloc(sizeof(struct Array) * 2);
    
    // 分配内存时同步记录行长度
    a[0].row = malloc(sizeof(uint32_t) * 3);
    a[0].row_len = 3; // 第一行含3个元素
    
    a[1].row = malloc(sizeof(uint32_t) * 2);
    a[1].row_len = 2; // 第二行含2个元素
    
    uint32_t temp1[] =  {2,3,4};
    uint32_t temp2[] = {5,8};
    
    for(int i=0;i<3;i++)
        a[0].row[i] = temp1[i];
    
    for(int i=0;i<2;i++)
        a[1].row[i]= temp2[i];

    for(int i=0;i<2;i++)
    {
        // 使用结构体中存储的row_len作为循环上限
        for(int j=0;j<a[i].row_len;j++)
        {
            printf("%d\t",a[i].row[j]);
        }
        printf("\n");
    }

    // 释放动态分配的内存,避免内存泄漏
    free(a[0].row);
    free(a[1].row);
    free(a);
    
    return 0;
}

关键修改说明

  • 为struct Array添加size_t row_len成员,专门存储每行的元素数量
  • 在为每行分配内存后,立即将对应长度赋值给row_len
  • 打印时直接调用a[i].row_len作为循环终止条件,替代原错误的sizeof计算
  • 新增内存释放逻辑,避免程序运行时的内存泄漏

运行修正后的代码,输出会符合预期:

2       3       4       
5       8       

内容的提问来源于stack exchange,提问作者rayapati ramya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:54:21