Инициализировать const char * Array - PullRequest
0 голосов
/ 13 сентября 2018

Я работаю в проекте C ++ 17, но должен использовать библиотеку C-legacy. Для этого мне нужно создать массив const char * в стиле C, но я борюсь с инициализацией. В частности,

#include <iostream>

int main(int argc, char* argv[])
{
    const int bound = 3;

    const char* inames[bound]{ "" };
    for(unsigned int i = 0; i < bound; i++) {
        const char *number = std::to_string(i).c_str();
        inames[i] = number;
    }

    for(unsigned int i = 0; i < bound; i++) {
        std::cout << "inames["
                  << std::to_string(i)
                  << "] = "
                  << inames[i]
                  << std::endl;
    }

    return 0;
}

возвращает

inames[0] = 2
inames[1] = 2
inames[2] = 2

как вывод, который я не понимаю. Я ожидал, что результат будет

inames[0] = 0
inames[1] = 1
inames[2] = 2

Может кто-нибудь помочь мне указать мне на мою ошибку?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Проблема в том, что у вас нет места для хранения самих строк, только указатели на них.

При этом строки хранятся в std :: strings, на которые ссылаютсяпростой массив C:

const int bound = 3;
std::vector<std::string> strings(bound);
const char* inames[bound];
for (unsigned int i = 0; i < bound; i++) {
    strings[i] =  std::to_string(i);
    inames[i] = strings[i].c_str();
}
0 голосов
/ 13 сентября 2018

Ваш код имеет неопределенное поведение .

std::to_string(i).c_str()

Вы создаете временный экземпляр std::string, а затем получаете его внутренний указатель const char*.В конце строки временный экземпляр мертв, поэтому указатель теперь болтается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...