C语言指向指针数组的pointer用malloc分配、strcpy复制写法及正确性咨询
代码正确性判断
你提供的代码片段放入完整代码中可以正常编译运行,语法逻辑没有错误,但存在内存泄漏的问题:
- 首先
char *(*tags)[2]的类型是「指向长度为2的char数组的指针」,你通过malloc (2 * sizeof *tags)申请了2组这样的数组空间,相当于构建了一个2行2列的char二维数组,tags[i][j]的访问方式完全合法,给tags[0][0]、tags[0][1]申请堆内存、拷贝字符串的写法没有问题。 - 内存泄漏问题:你只调用了
free(tags)释放了外层申请的数组空间,没有提前释放给tags[0][0]、tags[0][1]申请的堆内存。正确的释放逻辑应该在free(tags)前增加两行释放操作:
// 原有打印逻辑之后添加 free(tags[0][0]); free(tags[0][1]); free(tags);
和array of pointers to pointers(指针的指针数组)的差异
二者存在本质区别,核心差异在内存布局和使用特性上:
- 内存布局:你当前的实现中,
tags指向的是连续的内存空间,2组长度为2的char数组是连续存储的,总大小固定为2*2*sizeof(char*);而char** arr[2]这类指针的指针数组,第一层数组存储的是char**指针,每个指针指向的char数组的内存位置不一定连续,总大小也不固定。 - 步长规则:对当前的
tags执行+1操作时,步长是2*sizeof(char*),会直接跳转到下一行的起始位置;而对char**类型的指针执行+1操作时,步长只有sizeof(char*)。 - 灵活性:你当前实现的第二层维度是固定值2,编译期就已经确定,不能修改;而指针的指针数组的第二层每个子数组的长度可以自由调整,灵活度更高。
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

