为什么 void 指针不同于引用值?
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 所说的。
Success time: 0 memory: 3096 signal:0
0xbfbd5888
0x44c
0xbfbd5888
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 所说的。
Success time: 0 memory: 3096 signal:0
0xbfbd5888
0x44c
0xbfbd5888