Передача массива char через указатель на другой указатель временного массива - PullRequest
3 голосов
/ 07 ноября 2011

Я учусь использовать указатель для копирования массива символов.

У меня есть следующий код на C ++.То, что я пытаюсь сделать, это передать и массив (set1), используя указатель на другой массив указателей (temp).

Но когда я пытаюсь распечатать (temp), это не то же самое, что (set1).

Передача массива через указатель на другой указатель временного массива.

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    char set1[] = "ABC";

    char* p = &set1[0];

    int tempSize = 0;
    char* temp = new char[256];

    for (int i = 0; i < 3; i++)
    {
        *temp = *p;
        cout << *temp;   // ABC
        ++temp;
        ++tempSize;

        ++p;
    }

    cout << "\n";

    for (int i = 0; i < tempSize; i++)
    {
        cout << temp[i]; // Why ABC is not printed?
    }

    delete [] temp;

    return 0;
}

Ответы [ 4 ]

5 голосов
/ 07 ноября 2011

// Почему ABC не печатается?

Поскольку ваш указатель перемещается в неопределенное поведение регион:

char* temp = new char[256];
...
++temp;  // gone !!

Кроме того,

  1. вы не завершаете строку с \0 в конце (может не потребоваться в вашем коде)
  2. delete[] в конце этот поврежденный указатель.

Поскольку вы пишете для целей обучения, я бы предложил простое исправление вашего кода:

char* const temp = new char[256];
      ^^^^^ ensures `temp` is not modifiable

Теперь используйте temp[i] для обхода.

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

Строки в стиле C имеют нулевой терминатор - «ABC» содержит четыре символа.Кроме того, я совсем не уверен, что вызов delete для temp действителен - вы увеличивали его с тех пор, как он был «обновлен».

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

Проблема в этой строке:

++temp;

Вы увеличиваете указатель и затем пишете в него. В конце temp[i]; указывает не на начало вашей строки, а на конец.

Самый простой способ сделать это - удалить первый цикл for с помощью:

for (int i = 0; i < 3; i++)
{
    temp[i] = set1[i];
}
temp[4] = '\0'; // don't forget to close the string
0 голосов
/ 07 ноября 2011

Это потому, что в цикле копирования массива вы меняете temp.После цикла он указывает на один за пределами скопированных данных.

Кроме того, вы забыли завершить новый выделенный массив.Вы должны добавить символ '\0' в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...