C语言如何将静态amap_t指针数组改动态且无需修改main访问逻辑
问题解答
结论
完全可以不修改main函数的原有访问逻辑,也不需要用到三级指针做复杂操作,只要修正动态数组的类型定义即可。
错误原因说明
你之前的修改方案出错的核心是mymap的类型定义不匹配:
- 原代码中
static amap_t *mymap[10]是「存储amap_t*类型指针的数组」,mymap[cnt]的类型是amap_t*,因此可以直接用->访问结构体成员,也可以直接和NULL比较 - 你之前错误地将
mymap定义为static amap_t *mymap,此时mymap[cnt]的类型是amap_t结构体本身,自然需要修改访问逻辑
正确修改方案
1. 修正全局mymap定义
把原来的静态数组定义:
static amap_t *mymap[10];
替换为动态指针定义:
static amap_t **mymap;
这个定义下,mymap是指向amap_t*类型的指针,动态分配数组后,mymap[cnt]的类型和原静态数组完全一致,访问逻辑无需任何修改。
2. 修正prepare_mymap函数实现
int prepare_mymap (amap_t ***arg_map){ // 参数为三级指针,用于修改amap_t**类型的mymap本身 int arg_map_size = 10; // 这里可以动态调整数组大小,不需要写死10 // 第一步:分配指针数组的内存 *arg_map = malloc(sizeof(amap_t *) * arg_map_size); if (*arg_map == NULL) { printf("malloc for mymap failed\n"); return -1; } // 重要:先把所有数组元素初始化为NULL,避免野指针 for (int i = 0; i < arg_map_size; i++) { (*arg_map)[i] = NULL; } // 原有分配逻辑几乎不用调整 short int i; for (i =0; i < arg_map_size; ++i){ if (i % 2 == 0) { int r = posix_memalign ((void **) &(*arg_map)[i], 16, (sizeof(int) * POSSIBLE_HEIGHTS)); if (r != 0) { printf ("memalign failed @ %d\n", i); } else { printf ("mem allocated @ %d\n", i); // 对齐原有逻辑:分配的内存绑定到va_height成员 (*arg_map)[i]->va_height = (int*) (*arg_map)[i]; (*arg_map)[i]->va_length = NULL; } } } return 0; }
3. 仅需修改一处main函数代码
只需要把原来的调用:
prepare_mymap(&mymap[0]);
修改为:
prepare_mymap(&mymap);
其余所有访问逻辑(包括你提到的NULL检查、结构体成员访问)完全不需要修改,可以直接沿用原有大量的业务代码。
补充说明
如果连prepare_mymap的调用参数都不想改,可以通过宏定义做兼容,正常场景下只要改这一处调用就足够满足需求。
内容的提问来源于stack exchange,提问作者Aval Sarri
相关产品推荐
相关产品推荐

