Запрос приращения указателя C ++

У меня есть рабочий код для функции, которая принимает символ и число и формирует строку, дублируя этот символ такое количество раз. Вот кусок, который прекрасно работает.

char * buildstr(char c, int n)
{
char * pc = new char[n+1];
for (int i = 0; i < n; ++i)
{
*(pc+i) = c;
}

*(pc+n) = '\0';
return pc;
}

Но если я использую другую логику, где я непосредственно увеличиваю сам указатель, тогда я получаю ошибку, когда освобождаю память в основной функции, используя delete [].

В чем может быть моя проблема?

Спасибо,

char * buildstr(char c, int n)
{
char * pc = new char[n+1];
for (int i = 0; i < n; ++i)
{
*pc = c;
pc++;

}
*(pc) = '\0';
return pc;
}

1

Решение

Во втором примере вы увеличиваете значение указателя. Когда вы пытаетесь удалить его, он указывает на последнюю позицию массива.

Таким образом, когда вы звоните delete[] на нем он падает, как и ожидалось pc указать на адрес, который был первоначально выделен с помощью new[],

Я рекомендую вам использовать первый подход, так как вы сможете отслеживать базовый адрес в течение всего срока службы pc, Более того, я думаю, вам было бы легче сделать это, используя обозначение массива.

Рассмотрите возможность использования:

pc[i] = c;

вместо

*(pc+i) = c;

Как это более идиоматично и легко читается. Если вы просто используете арифметику указателя, придерживайтесь первого подхода, который вы описали.

2

Другие решения

Проблема в том, что вы возвращаете увеличенный указатель. delete[] должен вызываться со значением указателя, которое было возвращено вызовом new[]в противном случае вы получите неопределенное поведение. То же самое относится и к звонкам free и указатели возвращены malloc, calloc и т.п.

7

В первой функции предположим, что ваш указатель начинается с 0x00100.
когда вы делаете цикл, вы переходите к следующему адресу, например, 4 цикла:

0x00100
0x00101
0x00102
0x00103

но в конце вы возвращаете указатель на 0x00100, потому что вы использовали индекс *(pc+i) где i это индекс, так что это хорошо.

Теперь для второй функции вы делаете то же самое, за исключением того, что вы перемещаете указатель сам по себе без индекса, поэтому вы возвращаете указатель на последний адрес

0x00103

То есть ваша вторая функция не работает

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector