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 *指针强制转换有问题,但是我不知道为什么。有人可以帮忙吗?
最佳答案
您使用以下方法创建未定义的行为:
void* create(){
int a = 1;
float b = 2.2;
string c = "aaa";
mystruct x(&a, &b, &c);
void* p = &x;
return p;
}
在那里,您可以使用指向
mystruct
的自动存储范围(也称为局部变量)中的对象的指针来初始化create
。从返回create
的那一刻起这些对象就不复存在了,因此指针变为无效。此外,您还将在mystruct
函数内返回指向create
自动存储对象的指针。因此,这是在未定义行为之上调用未定义行为。编辑这是一个建议的解决方案:
停止在结构内部使用指针。无论如何,将指针传递到
int
或float
都是没有意义的,因为指针将始终大于这些指针。如果您传递一个指针或一个指向函数的指针,则两者都将通过复制值来传递,但是有了指针,则需要执行额外的间接步骤。如果要使用它们来传递“引用”(函数可以在其中更改值),则将指针传递给数字类型是有意义的。传递指向结构的指针也很有意义,这样就不必复制整个结构。
因此,我建议您从整体上摆脱指针。您显然还不了解它们是如何工作的,并且对于您所处的特定任务,它们毕竟是错误的工具。