malloc使用困惑:如何创建两倍于p的字符串数组(无需手动指定数值)
解决指针数组扩容问题:无需硬编码大小实现两倍槽位
咱们直接拆解问题,核心就是彻底摆脱硬编码数值,完全基于原数组p的属性来计算所需内存,这样不管p的元素数量、指针大小怎么变(比如切换32位/64位系统),代码都能自适应工作。
关键逻辑拆解
获取原数组
p的元素个数
因为p是固定大小的数组,我们可以用sizeof(p) / sizeof(p[0])来计算它的元素数量:sizeof(p):整个数组占用的总字节数sizeof(p[0]):数组中单个元素(也就是char*类型指针)的字节数
两者相除就能得到p的元素个数(这里是2),完全不用手动写死数值。
获取单个指针的通用大小
你提到的8其实是64位系统下char*的字节数,要做到跨平台通用,直接用sizeof(char*)就好——32位系统下它会自动变成4,64位就是8,再也不用硬编码具体数字。计算两倍槽位的总内存
把上面两个值结合,总内存大小就是:(原数组元素个数 × 2) × 单个指针大小,写成代码表达式就是:(sizeof(p)/sizeof(p[0])) * 2 * sizeof(char*)
修改后的完整代码
把原来硬编码的malloc(4 * 8)替换成上面的计算式,最终代码如下:
#include <stdlib.h> // 别忘了包含malloc所需的头文件 int main() { char *p[] = {"hello", "goodbye"}; char **a; // 基于p的属性计算两倍槽位的内存大小 a = malloc( (sizeof(p)/sizeof(p[0])) * 2 * sizeof(char*) ); }
额外实用提示
如果之后需要把p里的字符串指针复制到新数组a的前半部分,可以用循环快速完成:
// 复制p的元素到a的前半段 for (int i = 0; i < sizeof(p)/sizeof(p[0]); i++) { a[i] = p[i]; } // 后半段槽位可以用来存放新的字符串指针
内容的提问来源于stack exchange,提问作者user9314692
相关产品推荐
相关产品推荐

