You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

可以将指针声明为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:12:03