Я думаю, что по какой-то причине меня смущает, как инициализировать значение указателя 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;

Надеюсь, кто-то сможет прояснить это для меня, спасибо.

c++
0
Etra 18 Апр 2020 в 08:27

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. Тогда вам не нужно беспокоиться об освобождении памяти, и конструктор копирования по умолчанию вашего класса будет делать все правильно.

1
selbie 18 Апр 2020 в 05:45