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自动存储对象的指针。因此,这是在未定义行为之上调用未定义行为。

编辑这是一个建议的解决方案:

停止在结构内部使用指针。无论如何,将指针传递到intfloat都是没有意义的,因为指针将始终大于这些指针。如果您传递一个指针或一个指向函数的指针,则两者都将通过复制值来传递,但是有了指针,则需要执行额外的间接步骤。如果要使用它们来传递“引用”(函数可以在其中更改值),则将指针传递给数字类型是有意义的。

传递指向结构的指针也很有意义,这样就不必复制整个结构。

因此,我建议您从整体上摆脱指针。您显然还不了解它们是如何工作的,并且对于您所处的特定任务,它们毕竟是错误的工具。

07-28 11:58