可以将指针声明为void类型来存储char类型数据的地址吗?
首先明确:void* pointer = new char [5]; 这段代码本身是符合C++语法的,编译可以通过,你真正遇到的问题是后续无法直接用这个void*指针操作内存,比如调用你代码里的strcpy_s时会直接编译报错。
指针需要区分类型,核心有两个原因:
- 决定解引用操作的规则:解引用指针本质是读取指针指向地址存储的值,编译器需要知道读多少字节、怎么解析读到的二进制内容。比如
char*解引用会读1个字节,当成字符处理;int*解引用会读4字节(32位平台下)当成整数处理。而void*属于无类型指针,编译器完全不知道要怎么解析它指向的内存,所以不允许直接解引用void*指针。 - 决定指针运算的步长:当你做
pointer + 1这类操作时,步长由指针类型决定:char*会向后偏移1字节,int*会向后偏移4字节,void*没有关联的类型大小,C++标准直接禁止对void*做指针运算。
回到你的代码场景,strcpy_s的第一个参数要求是char*类型,因为这个函数内部要按1字节步长逐位写入字符串内容,还要做缓冲区边界检查,传入void*的话编译器无法完成类型校验,也无法给函数提供正确的内存操作规则,直接就会编译失败。
如果你非要用void*存储这个地址也不是不行,后续操作的时候强转成对应类型即可:
void* pointer = new char [5]; strcpy_s((char*)pointer,4, "foo");
但这种写法完全是多此一举,平白增加了出错概率,不如直接声明成对应类型的指针更安全清晰。
内容的提问来源于stack exchange,提问作者Mephobia
相关产品推荐
相关产品推荐

