C++ "oldstyle container": pointer array new - 可能的误解?

问题描述 投票:0回答:1

我只是玩玩而已,只是不明白为什么第一个版本能用,而第二个版本却不能用?

using namespace std;

#include <iostream>

int main(){

    int a,b;
    double d{3035.4534536};
    cout<<"Size of: int "<<sizeof (int)<<" double "<<sizeof (double)<<endl;

    a=*((int*)&d);
    b=((int*)&d)[1];
    int dd[2]; //{a,b};
    dd[0]=a; dd[1]=b;
    cout<<"a: "<<a<<" |b: "<<b<<endl;
    cout<<"d: "<<d<<" |: "<<*((double*)&dd)<<endl;

    // int  size=sizeof(d)/sizeof(int)+1, *temp= new int[size],
        // *f{(int*)(&d)}, *t{temp}, *s{t+size};
    // while(t!=s) { *t=*f; ++f; ++t; cout<<"."; }
    // cout<<"dOrig.: "<<d<<" |temp: "<<*((double*)&temp)<<endl;
    // delete[] temp;

    int size=sizeof(d)/sizeof(int)+1, *temp= new int[size];
    char *f{(char*)&d}, *t{(char*)temp}, *s{t+sizeof(d)};
    while(t!=s) { *t=*f; ++f; ++t; cout<<"."; }
    cout<<"dOrig.: "<<d<<" |temp: "<<*((double*)&temp)<<endl;
    delete[] temp;
}

...我知道,"这正是为什么会有容器",这纯粹是好奇,我只是想了解第二个版本的问题是什么?

是否有一个我不知道的转换?还是new-Statement返回的指针比指向第一个元素的普通指针要多?

c++ arrays pointers new-operator
1个回答
1
投票
 a=*((int*)&d);

是不正确的。当你做(int*)时,你使用的是reinterpret_cast。

&d 是一个指针到双数。你不能将一个指针到双数转换为指针到int。好吧,你可以,但你不能做下一个操作,去引用它。当你试图读取内存点时,你就会用 (int*)&d 作为一个整数,你会得到未定义的行为。

从那里发生的事情是,嗯,复杂的和未定义的。不要去那里。

© www.soinside.com 2019 - 2024. All rights reserved.