Пустая строка после прохождения через функцию

#c #arrays #string

#c #массивы #строка

Вопрос:

Я получил пустую строку для первого элемента массива («»), в то время как остальные верны. Кажется, что объект string уничтожается сразу после выхода из функции. Это не связано с зависшим указателем? Как это решить?

 void func(const char**amp;ptr)
{
    std::string errorstring = "Test1";
    ptr = (const char **)malloc(5 * sizeof(const char *));
    ptr[0] = errorstring.c_str();
    ptr[1] = "Test2";
    ptr[2] = "Test3";
    ptr[3] = "Test4";
    ptr[4] = "Test5";
}
  

Спасибо

Комментарии:

1. 1. Да. 2. Это точно, 3. Сделайте что-нибудь еще. Современному коду C не нужно вводить malloc или что-либо новое. Сосредоточьтесь на том, чтобы избавиться от любой причины, по которой, по вашему мнению, вам нужно malloc или что-то новое.

2. Это не связано с зависшим указателем? Да — это именно то, что вы присваиваете ptr[0] — висячий указатель.

3. std::vector<std::string> — Это то, что вы используете в современном C , а не тройные указатели.

4. Спасибо PaulMcKenzie. Я попробую эту стратегию. Кажется, я еще не обновился до новых неуправляемых функций. Обычно я использовал управляемые.

Ответ №1:

ptr[0] устанавливается так, чтобы указывать на буфер, управляемый errorstring . Когда функция возвращается, errorstring выходит за пределы области видимости и уничтожается, освобождая этот буфер. ptr[0] становится висячим указателем. Любая попытка вызывающего объекта разыменовать ее будет демонстрировать неопределенное поведение.

Ответ №2:

При вводе "Text1" где-то будет выделен массив символов. Когда вы вводите std::string errorstring = "Test1"; , then errorstring будет инициализирован этим массивом, он не просто будет ссылаться на него, он скопирует весь массив символов — "Text1" в свою собственную память. В конце func автоматически будет вызван деструктор errorstring , который освободит свою собственную память, делая все, что .c_str() возвращено, недействительным. Таким образом, ptr[0] становится зависшим указателем. Неправильным представлением было бы то, что errorstring это то же самое, что (просто ссылка на) «Test1», из-за = знака. Но = в c означает присваивание, а не равенство. Фактически, errorstring это совершенно другой объект, чем "Test1" .