为什么无效指针与参考值不同
Why is void pointer different from reference value?
class Class1
{
int data;
int *dataPtr;
}
int main()
{
Class1 object;
Class1 *objectPtr = &object;
object.data = 1100;
object.dataPtr = &(object.data)
std::cout << object.dataPtr << std::endl; //0x22aaa4
std::cout << (void *) (object.data) << std::endl; //0x1b198
std::cout << (void *) &(object.data) << std::endl; //0x22aaa4
为什么(void *) (object.data)
与object.dataPtr
不同?
如果我想使用 memcpy 将值从其他地方复制到object.data
,我应该使用哪个内存位置?
memcpy( (void *) (object.data), source, size);
或
memcpy( (void *) &(object.data), source, size);
谢谢!
因为(void *) (object.data)
将data
的数值重新解释为指针,所以它可以有任何值;对它做任何事情都会导致未定义的行为。(如注释中所述,如果实现定义的强制转换仅使用数值 1100 作为地址并且未定义的行为不会引起任何意外,则人们会期望它是0x44c
的。
object.data
的地址是 &object.data
。
如果您使用更安全的强制转换,或者在memcpy
的情况下使用隐式转换,则编译器将阻止这种狡猾的转换:
static_cast<void *>(object.data) // ERROR: int->pointer conversion
static_cast<void *>(&object.data) // OK: pointer conversion
memcpy(object.data, source, size); // ERROR: int where pointer expected
memcpy(&object.data, source, size); // OK: pointer converts to void*
一般来说,避免使用 C 型石膏。和memcpy
.和指针。
这个问题
是假的。 如果不首先修复语法错误,代码甚至无法编译。
一旦你让它编译,它就会准确地产生预期的输出,而不是 OP 所说的它产生的输出。
这里: http://ideone.com/qXWkGF
Success time: 0 memory: 3096 signal:0
0xbfbd5888
0x44c
0xbfbd5888
相关文章:
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- C++错误消息*成员参考.**初学者*
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 参考资源文件VC++中的$(SolutionDir)
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- FFMPEG配置文件级别id大小无效
- 错误:从"int"到枚举c++的转换无效
- 如何修复此错误:className::className的无效使用
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- C++-模板嵌套类的引用初始化无效
- 错误:无效的预处理指令 #i 的意思是 #if?
- 为什么在运算符重载时需要参考?
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 从参考中获取的指针可以在定义明确的C 中取无效
- 通过作为参考,ISTream的无效izialization误差