如何将new[]返回的指针赋值给char (*buf)[]类型的类成员?
关于
char (*buf)[]的疑问解答 咱们先把这个问题拆开来慢慢捋清楚~
1. 能不能把new[]返回的char*存到char (*buf)[]里?
答案是不能直接存,编译器报错的核心原因就是类型不匹配:
new char[N]返回的是char*,本质是指向单个char的指针(也可以看作指向char数组首元素的指针);- 而
char (*buf)[]是指向未指定大小的char数组的指针,属于数组指针类型,和char*是完全不同的指针范畴。
虽然你可以用强制类型转换(比如buf = reinterpret_cast<char (*)[]>(new char[100]);)强行把char*塞进去,但这种做法极度不推荐——它会彻底丢失数组的大小信息,后续你用sizeof(*buf)会得到错误结果,访问数组元素时也很容易出现越界、触发未定义行为,完全违背了C++的类型安全设计。
2. 那char (*buf)[]这种声明到底有什么用?
这种指针更多是C语言里的用法,在C++中其实很少见,主要适用场景有两个:
- 适配变长数组(VLA):在支持C99变长数组的编译器(比如GCC)中,如果你定义了
int n = 10; char arr[n];,那么&arr的类型就是char (*)[n],此时可以把它赋值给char (*buf)[]——相当于把数组的具体大小信息暂时“隐藏”,但注意C++标准并不支持变长数组,这属于编译器扩展特性。 - 作为函数参数接收任意大小的char数组指针:比如写一个函数
void process(char (*arr)[]),理论上可以接收任意大小的char数组的地址,但这种用法在C++里非常鸡肋,不如直接传char*+数组大小参数,或者用模板函数(比如template<size_t N> void process(char (&arr)[N]))来获取编译期的数组大小,安全又清晰。
3. 如果你想动态分配char数组,正确的打开方式是什么?
如果你的需求是动态管理char数组,更符合C++规范的做法有两种:
- 如果你知道数组的大小(编译期或运行期都可以),可以用明确大小的数组指针:
// 比如分配一个大小为200的char数组,数组指针类型是char (*)[200] size_t arr_size = 200; char (*buf)[200] = new char[1][200]; // 访问元素:(*buf)[index] (*buf)[0] = 'x'; // 释放内存 delete[] buf; - 如果你需要更灵活的动态数组,直接用
std::vector<char>就好,完全不用手动管理内存,还自带大小管理:std::vector<char> buf(200); // 初始化大小为200的char数组 buf[0] = 'y'; // 直接访问元素 // 不需要手动delete,vector会自动释放内存
内容的提问来源于stack exchange,提问作者Rich Ramos
相关产品推荐
相关产品推荐

