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);
谢谢!
答案 0 :(得分:3)
因为(void *) (object.data)
将data
的数值重新解释为指针,所以它可以有任何值;并使用它做任何事情会导致未定义的行为。 (正如评论中所指出的那样,如果实现定义的强制转换仅使用数值1100作为地址而且未定义的行为不会引起任何意外,则可以预期它将是0x44c
。)< / p>
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
。和指针。
答案 1 :(得分:0)
这个问题是假的。如果没有先修复语法错误,代码甚至无法编译。
一旦你进行编译,就会产生完全预期的输出,而不是OP所说的那样。
Success time: 0 memory: 3096 signal:0
0xbfbd5888
0x44c
0xbfbd5888