Вылезла ошибка с4700

137
08 августа 2021, 03:40
IN In::checkIn(IN& in)
{
    unsigned char *checkText = in.text;
    unsigned char *newText;
    unsigned short index=0,temp=0,k=0;
    for (int i = 0; i < strlen((char*)checkText); i++) {        
    if (checkText[i] == ' ') {
            if (k == 0) continue;
            if (checkText[i] == ' ') continue;
        }
    newText[k] = checkText[i];
    k++;
    }
return in;
}

Данная функция должна записывать в строку newText строку checkText без пробелов. Но при компиляции вылазит

Ошибка C4700 использована неинициализированная локальная переменная "newText".

Как тогда её инициализировать?

Answer 1

Что такое у вас newText? Судя по всему, строка. Куда вы хотите писать ваши unsigned char вот здесь?

newText[k] = checkText[i];

Сейчас - в некоторое случайное место в памяти.

А как инициализировать? Сделать так, чтоб она указывала на корректное, нужное вам место в памяти. Я же не могу знать, что вы хотите, смысл ваших действий... Может, надо выделить память динамически, может, передать указатель через аргумент функции - это решаете вы.

Чтоб компилятор просто заткнулся и не кричал, достаточно

unsigned char *newText = nullptr;

но, думаю, вы понимаете, что это глупое решение :)

Answer 2

почему бы просто не использовать класс string Ответ выше звучит исчерпывающе) вы создаете указатель unsigned char newText; но не инициализируйте его (оно не инициализируется NULL по умолчанию) выходит ссылается на случайный участок памяти. Вам необходимо направить это на какой либо массив в случае хранения данных количество которых не превышает strlen((char)checkText) можно просто .... код не совсем понятен для чего вам вообще нужен вы делаете в него как бы запись но в логике это не используется ... мне кажется у вас немного страдает архитектура функции.

Answer 3

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

IN In::checkIn(IN& in)
{
    const size_t size = strlen(in.text);    
    size_t k = 0;
    for (int i = 0; i < size; ++i) {
        if (in.text[i] != ' ') {
           in.text[k++] = in.text[i];           
        }
    }   
    //и поставим завершающий символ в свое место
    in.text[k] = '\0';  
    //если для массива выделена память из кучи, 
    //и память критична, то можно выделить новую
    //копировать, а потом удалять старый
    return in;
}
READ ALSO
jQuery find по массиву элементов

jQuery find по массиву элементов

Как правильно произвести поиск в массиве элементов?

177
Dokan запрашивает открытие папки как файла

Dokan запрашивает открытие папки как файла

У меня в файловой системе все данные хранятся в ОЗУЯ создал папку, в которую скопировал файл

267
Событие нажатия кнопок на блютуз гарнитуре C#

Событие нажатия кнопок на блютуз гарнитуре C#

Каким образом можно организовать отслеживание кнопок плей/пауза, громкость +/- блютуз гарнитуры? Заметил что в UWP приложениях отслеживание...

165