void* 转换得到意外的输出
void* casting get unexpected output
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 34 ]\303fffff.4UH15H140H1}0H1。
我想是: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
返回的那一刻不复存在,因此指针变得无效。此外,您还在 create
函数内返回指向 mystruct
自动存储对象的指针。所以这是在未定义行为之上调用未定义行为。
编辑这里有一个建议的解决方案:
停止在结构内部使用指针。无论如何,将指针传递给 int
或 float
是没有意义的,因为指针总是比那些 大 。如果你传递一个指针或一个指向函数的指针,它们都将通过复制值来传递,但是对于指针,有一个额外的间接步骤。如果您想使用它们传递 "reference" 函数可以更改值的地方,传递指向数字类型的指针是有意义的。
将指针传递给结构也很有意义,这样就不必复制整个结构。
所以我建议你完全去掉指针。您显然还不了解它们是如何工作的,并且对于您所拥有的特定任务,它们无论如何都是错误的工具。
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 34 ]\303fffff.4UH15H140H1}0H1。 我想是: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
返回的那一刻不复存在,因此指针变得无效。此外,您还在 create
函数内返回指向 mystruct
自动存储对象的指针。所以这是在未定义行为之上调用未定义行为。
编辑这里有一个建议的解决方案:
停止在结构内部使用指针。无论如何,将指针传递给 int
或 float
是没有意义的,因为指针总是比那些 大 。如果你传递一个指针或一个指向函数的指针,它们都将通过复制值来传递,但是对于指针,有一个额外的间接步骤。如果您想使用它们传递 "reference" 函数可以更改值的地方,传递指向数字类型的指针是有意义的。
将指针传递给结构也很有意义,这样就不必复制整个结构。
所以我建议你完全去掉指针。您显然还不了解它们是如何工作的,并且对于您所拥有的特定任务,它们无论如何都是错误的工具。