在Windows 7(64位)中使用g ++ 4.8.3编译时,以下程序打印969。
取消注释Y
复制构造函数的声明,程序会产生分段错误。对地址的分析表明,a
和a.value
始终具有相同的地址。
在前一种情况下(评论)a
和arg1
分配在不同的位置,在后者(无评论)中它们共享相同的位置,因此内容969被错误地解除引用为指针。
任何人都能解释为什么行为会发生变化吗?似乎在前一种情况(评论)中使用参数值,在后一种情况下使用参考参数(无评论)。
#include <iostream>
struct X
{ double value; };
struct Y {
// Uncommenting copy constructor, myFunc should behavior in same way
// Y(const Y&);
X *ptr;
};
void myFunc(Y arg1) { std::cout << arg1.ptr->value << std::endl; }
typedef void (*XLFUNC) (void*);
int main() {
X a;
a.value = 969;
XLFUNC xlFunc = (XLFUNC)myFunc;
xlFunc(&a);
return 0;
}