Я думаю, что по какой-то причине меня смущает, как инициализировать значение указателя char. Может, я над этим слишком много думаю. У меня это есть в заголовочном файле Login.h char * arg1;
Я получил предупреждение о том, что переменная-член не инициализирована в этом конструкторе. Итак, в Login.cpp я поместил:
Login::Login() {
// TODO Auto-generated constructor stub
arg1 = (char *)malloc(50);
//arg1 = new char();
//arg1 = nullptr;
}
В чем разница между:
arg1 = (char *)malloc(50);
arg1 = new char(50);
Когда я пробую приведенный ниже код, я получаю несовместимый тип.
arg1 = 'A';
Я думаю, я смущен инициализацией указателя по сравнению с обычной переменной
Я должен просто сделать это?
arg1 = nullptr;
Надеюсь, кто-то сможет прояснить это для меня, спасибо.
1 ответ
Предполагая, что arg1
интерпретируется как символьная строка, это, помимо прочего, порадует компилятор:
Login::Login() {
// TODO Auto-generated constructor stub
arg1 = (char *)malloc(50);
arg1[0] = '\0';
}
Теперь arg1
- это правильно завершенная строка с нулевым символом в конце. По сути, это пустая строка. Без этого инициализатора = '\0'
arg1 был указателем на выделенную, но неинициализированную память. Первоначально, до этого изменения, не было гарантии наличия нулевого терминатора в выделенном 50-байтовом массиве. Любая попытка strcpy
содержимого этой строки приведет к неопределенному поведению, поскольку код копирования может пройти границы массива в поисках нулевого символа, которого там нет.
Еще две вещи, которые следует учитывать. Почему бы просто не объявить arg1
имеющим тип char arg1[50]
или тип std::string arg1
. Тогда вам не нужно беспокоиться об освобождении памяти, и конструктор копирования по умолчанию вашего класса будет делать все правильно.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .