Почему в следующих похожих кодах один дает ошибку времени выполнения, а другой нет - PullRequest
0 голосов
/ 07 ноября 2018

Ну, это действительно странно
Рассмотрим следующие два кода: -

#include <iostream>
using namespace std;

int main() {
    int a[]={1,2,3,4,5};
    int* ptr[5];

    for(int i = 0; i < 5; i++)
    {
        *ptr[i]=a[i];
    }

    for(int i = 0; i < 5; i++)
    {
        cout<<*(ptr[i]);
    }
}

И

#include <iostream>
using namespace std;

int main() {
    int a[]={1,2,3,4,5};
    int* ptr[5];


        *ptr[0]=a[0];
        *ptr[1]=a[1];
        *ptr[2]=a[2];
        *ptr[3]=a[3];
        *ptr[4]=a[4];




       cout<<*(ptr[0])<<endl;
       cout<<*(ptr[1])<<endl;
       cout<<*(ptr[2])<<endl;
       cout<<*(ptr[3])<<endl;
       cout<<*(ptr[4])<<endl;


}

Первый дает ошибку времени выполнения, в то время как второй дает выходные данные 1, 2, 3, 4, 5, я не могу найти разницу между двумя кодами, может кто-нибудь помочь мне найти разницу.

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018
#include <iostream>
using namespace std;

int main() {
    int a[]={1,2,3,4,5};
    int* ptr[5];


        *ptr[0]=a[0];
        *ptr[1]=a[1];





       cout<<*(ptr[0])<<endl;
       cout<<*(ptr[1])<<endl;




}

приведенный выше код работает нормально и выдает выходные данные 1, 2 но

#include <iostream>
using namespace std;

int main() {
    int a[]={1,2,3,4,5};
    int* ptr[5];


        *ptr[0]=a[0];
        *ptr[1]=a[1];
        *ptr[2]=a[2];




       cout<<*(ptr[0])<<endl;
       cout<<*(ptr[1])<<endl;
       cout<<*(ptr[2])<<endl;




}

этот код выдает ошибку времени выполнения на кодовых блоках (gcc), я просто запутался

0 голосов
/ 07 ноября 2018

Уже установлено, что

*ptr[0] = a[0];

с нераспределенным указателем - неопределенное поведение.

Решение

ptr[0] = &a[0];

тоже уже дано. Это работает, но оно ограничено, потому что теперь массив ptr привязан к a, что вам не всегда нужно. В этом случае вы можете захотеть

ptr[0] = new int(a[0]);

Это инициализирует массив значениями от a, но сохраняет его независимым. Тем не менее, это вводит ручное управление памятью, и это может стать сложным в более сложном коде (утечки памяти, двойные освобождения, висячие указатели), поэтому было бы более похожее на C ++ решение (при условии, что указатели указывают на что-то более интересное, чем целое число, потому что теперь кажется, что указатели не нужны).

#include <memory>
#include <vector>
#include <iostream>

int main() {
    int a[]={1,2,3,4,5};
    std::vector<std::unique_ptr<int>> ptrs;

    for(auto i: a)
    {
        ptrs.emplace_back(std::make_unique<int>(i));
    }

    for(auto& i: ptrs)
    {
        std::cout << *i;
    }
}
0 голосов
/ 07 ноября 2018

У меня есть обе ошибки во время выполнения. Результат перекодирования с указателем переменной ниже.


#include <iostream>
using namespace std;

int main() {
    int a[]={1,2,3,4,5};
    int* ptr[5];

    for(int i = 0; i < 5; i++)
    {
        ptr[i]=&a[i];
    }

    for(int i = 0; i < 5; i++)
    {
        cout<<*(ptr[i]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...