struct mystruct{
int* x;
float *y;
string *z;
mystruct(int* a,float* b, string *c): x(a), y(b), z(c){}
};
void* create(){
int a = 1;
float b = 2.2;
string c = "aaa";
mystruct x(&a, &b, &c);
void* p = &x;
return p;
}
void print(void *p){
mystruct* p1 = static_cast<mystruct*>(p);
cout << *p1->x << " " << *p1->y << " "<<*p1->z<< endl;
}
int main(){
cout << sizeof(mystruct) << endl;
void* p1 = create();
print(p1);
return 0;
}
代码的输出如下:24 1 2.76648e + 19 \ 203 \ 304] \ 303fffff。\ 204UH \ 211 \ 345H \ 201 \ 354 \ 220H \ 211} \ 270H \ 211。 我认为是:24 1 2.2 aaa
我猜void *指针转换有问题,但我无法弄清楚原因。有人可以帮忙吗?
答案 0 :(得分:4)
您使用以下方法创建未定义的行为:
void* create(){
int a = 1;
float b = 2.2;
string c = "aaa";
mystruct x(&a, &b, &c);
void* p = &x;
return p;
}
在那里,您使用{{1>}的自动存储空间(又名本地变量)中的对象初始化mystruct
。这些对象在返回create
的那一刻就不复存在,因此指针变得无效。此外,您还在create
函数内返回指向mystruct
自动存储对象的指针。所以这是在未定义的行为之上调用未定义的行为。
编辑这是一个建议的解决方案:
停止在struct中使用指针。无论如何将指针传递给create
或int
是没有意义的,因为指针总是大。如果将指针或指针传递给函数,则通过复制值传递任一个,但是使用指针会有一个额外的间接步骤。将指针传递给数字类型的地方是有意义的,如果你想使用它们传递一个“引用”,其中函数可以改变值。
将指针传递给结构也是有意义的,这样就不必复制整个结构。
所以我建议你完全摆脱指针。你显然还不明白它们是如何工作的,而对于那个特定的任务,你无论如何都是错误的工具。