C ++ «контейнер старого стиля»: указатель / массив / новый - возможное неверное представление? - PullRequest
0 голосов
/ 29 мая 2020

Я просто играю вокруг, просто не понимаю, почему первая версия работает, а вторая не работает?

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, больше, чем простой указатель на первый элемент?

1 Ответ

1 голос
/ 29 мая 2020
 a=*((int*)&d);

Неправильно. Когда вы выполняете (int *), вы используете reinterpret_cast.

&d - это указатель на double. Вы не можете преобразовать указатель на double в указатель на int. Что ж, вы можете, но вы не можете выполнить следующую операцию, разыменовав ее. Как только вы попытаетесь прочитать точку памяти до (int*)&d как целое число, вы получите поведение undefined.

То, что происходит оттуда, является сложным и неопределенным. Не go там.

...