Изменение содержимого в массиве указателей символов - PullRequest
1 голос
/ 11 ноября 2010

Кажется, это должно быть легко, но я потратил слишком много времени на это. Надеюсь, кто-то может помочь.

char *string_labels[5] = { "one", "two", "three", "four", "five" };

void myFunction(void)
{

    //can print them just like expected
    for(i=0; i < 5; i++)
    {
        printf("%s\n", string_labels[i]);
    }

    //how can i change the contents of one of the elements??
    sprintf(string_labels[0], "xxx"); <-crashes

}

Ответы [ 4 ]

4 голосов
/ 11 ноября 2010

Сбой из-за того, что он находится в постоянной памяти. Попробуйте

char string_labels[][6] = { "one", "two", "three", "four", "five" };
sprintf(string_labels[0], "xxx");
2 голосов
/ 11 ноября 2010

Чтобы сделать это, вам нужно использовать массив символов, чтобы у вас действительно было некоторое пространство для записи во время выполнения для изменения:

char string_labels[][20] = { "one", "two", "three", "four", "five" };

void myFunction(void)
{
    /* Printing works like before (could be improved, '5' is nasty). */
    for(i=0; i < 5; i++)
    {
        printf("%s\n", string_labels[i]);
    }

    /* Now, modifying works too (could be improved, use snprintf() for instance. */
    sprintf(string_labels[0], "xxx");
}
0 голосов
/ 11 ноября 2010

Каждый из string_labels[i] указывает на строковый литерал, и попытка изменить содержимое строкового литерала вызывает неопределенное поведение.

Вам нужно будет объявить string_labels как массив массивов char, а не как массив указателей на char:

#define MAX_LABEL_LEN ... // however big the label can get + 0 terminator

char string_labels[][MAX_LABEL_LEN]={"one", "two", "three", "four", "five"};

Это объявляет массив из 5 элементов (размер взят из числа инициализаторов) из MAX_LABEL_LEN массивов char. Теперь вы можете написать на содержание string_labels[i].

0 голосов
/ 11 ноября 2010

string_labels - массив указателей на символы, указывающие на строковые литералы.Поскольку строковые литералы доступны только для чтения, любая попытка изменить их приводит к неопределенному поведению.

Вы можете изменить объявление string_labels, как показано ниже, чтобы заставить sprintf работать:

char string_labels[][6] = { "one", "two", "three", "four", "five" };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...