#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"
.