C++中char**二级指针如何分配3个char*指针内存?
错误原因
你触发编译错误的核心原因是C++的new运算符语法不允许在带括号的类型id后面直接跟数组维度声明:你写的(char *)会被编译器优先识别为placement new的参数段起始标记,后面跟[3]的数组维度写法不符合语法规则,就会抛出对应的报错。
正确写法
C++完全支持这类二级指针的内存分配,逻辑和C语言完全一致,只需要去掉类型外层多余的括号即可:
char **a; // 分配可存储3个char*指针的连续堆内存 a = new char*[3];
这段代码在64位环境下会分配24字节的连续内存(单个char*占8字节,3个共24字节),赋值完成后你完全可以通过a[0]、a[1]、a[2]访问三个指针位置,后续再分别给这三个指针分配字符串存储内存,就能实现a[i][string_num]的访问形式,和C中用malloc(3 * sizeof(char*))的效果完全相同。
如果觉得指针数组的语法容易写错,也可以通过类型别名简化写法,避免语法歧义:
// C++11及之后版本可用 using char_ptr = char*; // 旧版本C++可用typedef写法:typedef char* char_ptr; char** a = new char_ptr[3];
内存释放注意事项
使用完内存后需要按层级释放,避免内存泄漏:先逐个释放a[0]、a[1]、a[2]指向的字符串内存,再释放存储三个指针的数组本身:
// 前提:已经给a[0]、a[1]、a[2]分配了对应的字符串堆内存 delete[] a[0]; delete[] a[1]; delete[] a[2]; delete[] a; a = nullptr;
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

