多维可变长数组打印异常:动态分配数组长度计算错误修复
问题分析与修复方案
你的判断完全正确,问题就出在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
相关产品推荐
相关产品推荐

