Как я могу изменить значение или статический символ * из функции? C ++ - PullRequest
3 голосов
/ 29 мая 2010

Я пытаюсь изменить значение «статического символа», который я определяю при запуске, я делаю это изнутри функции, и когда эта функция возвращает переменную, которую я пытаюсь восстановить, значение не сохраняется это.

Пример:

static char *X = "test_1";

void testFunc()
{
    char buf[256];
    // fill buf with stuff...
    X = buf;
}

Как мне добиться этого, не используя static для buf? Должен ли я использовать другой тип данных? если да, то какой?

Ответы [ 3 ]

6 голосов
/ 29 мая 2010

Строка X = buf устанавливает указатель X, указывающий на первый элемент массива buf. Когда функция возвращается, buf выходит из области видимости и больше не может использоваться, поэтому указатель в этой точке бесполезен.

Если у вас нет особых причин использовать необработанные строки C в вашей программе, используйте контейнер std::string, тогда вы можете просто вернуть std::string и не беспокоиться о динамическом выделении и управлении памятью для строки самостоятельно. *

2 голосов
/ 29 мая 2010

Как сказал Джеймс, используйте std::string ... за исключением того, что помните, что глобальный порядок строительства и разрушения между единицами перевода не определен.

Итак, если вы все еще хотите использовать char*, используйте strcpy (см. man strcpy) и убедитесь, что buf завершается NUL. strcpy скопирует buf в пункт назначения X.

char buf[256];
// ...
strcpy(X, buf);

Я должен добавить, что есть и другие причины для использования std::string. При использовании strcpy необходимо убедиться, что в буфере назначения (X) достаточно памяти для приема исходного буфера. В этом случае 256 намного больше, чем strlen("test_1"), поэтому у вас будут проблемы. Есть способы обойти это перераспределение X (например, X = new char[number_of_characters_needed]). Или инициализируйте X в массив символов 256 вместо char*.

IIRC, strcpy для статического определенного строкового литерала (например, char * X = "test_1") - неопределенное поведение ... Мораль этой истории ... Это C ++! Используйте std::string! :)

(Вы сказали, что были новичком в c ++, поэтому, возможно, вы не слышали «неопределенное поведение», что означает, что компьютер может ударить вас по лицу ... обычно это означает, что ваша программа аварийно завершится)

0 голосов
/ 29 мая 2010
static char *X = "test_1";

void testFunc()
{
    char buf[256];
    // fill buf with stuff...
    X = buf;
}

В приведенном выше примере, если вы запустите и отладите код, вы увидите, что значение X будет изменено в строке X = buf;

Если buf не является статичным и определен внутри определенной области (между {}), он будет выделен как временная переменная стека. Всякий раз, когда указатель инструкции покидает эту область, buf становится неопределенным, но X сохраняет старый адрес buf (указывающий на адрес стека) с неверными данными.

Обратите внимание, что X - это просто указатель, поэтому вы можете изменить его в любое время. И учитывая, что он статический, его определение будет оставаться действительным до конца программы.

Итак, если вы хотите изменить значение X, просто добавьте в него все, что захотите. Просто будьте осторожны, чтобы не сделать недействительными данные, на которые он укажет, прежде чем вы получите доступ к данным X (* X).

...