GPT-5.5 Pro 实战指南:构建可信赖的AI工作流
2026/6/4 20:11:12
上节回顾:上一讲介绍了C11的静态断言(_Static_assert),详细分析了其编译期校验机制、典型用途(类型/结构体大小、常量关系等)、常见陷阱(编译器标准、表达式限制、宏封装冲突),并给出了兼容C99的宏封装方法和最佳实践建议。
在C中,多维数组(如int arr[ROW][COL])通常是连续内存块,编译器自动分配和管理。但若数组规模较大,或需要动态分配,则必须用指针和malloc/calloc等手动管理内存。
常见有两种动态分配方式:
int*arr=malloc(ROW*COL*sizeof(int));// 访问方式:arr[i * COL + j]int**arr=malloc(ROW*sizeof(int*));for(inti=0;i<ROW;i++)arr[i]=malloc(COL*sizeof(int));// 访问方式:arr[i][j]int **arr和int arr[ROW][COL]语义不同,动态分配时若直接用arr[i][j]访问,易越界或未分配内存。arr,未释放每一行,导致内存泄漏。int **arr = malloc(ROW * COL * sizeof(int))后直接用arr[i][j]访问,未分配指针数组,行为未定义。int **data,分配和释放时未注意每一级的内存,易导致泄漏和野指针。arr[i * COL + j]访问。arr[i][j]。alloc_2d_int_array和free_2d_int_array等辅助函数,统一管理内存分配与释放。int**arr=malloc(ROW*sizeof(int*));// 未分配每一行arr[0][0]=1;// 未定义行为,可能崩溃int**arr=malloc(ROW*sizeof(int*));for(inti=0;i<ROW;i++)arr[i]=malloc(COL*sizeof(int));arr[0][0]=1;// 正确for(inti=0;i<ROW;i++)arr[i]=malloc(COL*sizeof(int));// ... 使用free(arr);// 每一行未释放,泄漏for(inti=0;i<ROW;i++)free(arr[i]);free(arr);int**arr=malloc(ROW*COL*sizeof(int));// 试图用arr[i][j]访问,未定义行为int*arr=malloc(ROW*COL*sizeof(int));arr[i*COL+j]=value;int**alloc_2d_int_array(introw,intcol){int**arr=malloc(row*sizeof(int*));if(!arr)returnNULL;for(inti=0;i<row;i++){arr[i]=malloc(col*sizeof(int));if(!arr[i]){// 分配失败时释放已分配for(intj=0;j<i;j++)free(arr[j]);free(arr);returnNULL;}}returnarr;}voidfree_2d_int_array(int**arr,introw){for(inti=0;i<row;i++)free(arr[i]);free(arr);}i*COL+j)。动态多维数组是C语言中极易出错的内存管理场景,合理的分配/释放封装和明确的访问方式设计,是高质量代码的基础。切勿混用分配方式和访问方式,否则极易造成严重内存或程序崩溃问题。
公众号 | FunIO
微信搜一搜 “funio”,发现更多精彩内容。
个人博客 | blog.boringhex.top