У меня есть массив char *
как это:
char * gradient_xpm[] = {"abc", "def", "ghi"};
Мне нужно изменить значение этих строк.
Я пробовал strcpy
и оператор =
, но это дает мне ошибку сегментации.
например:
strcpy(gradient_xpm[1],"jkl"); gradient_xpm[1][2] = 'x';
Я не смог отредактировать ни одного символа. Как изменить эти значения?
У вас есть строковые константы в вашем массиве, и они не могут быть изменены. Это причина ваших segfaults.
Вам нужно настроить свой массив без использования строковых констант, а затем скопировать строковые константы в ваш массив.
Что-то вроде:
char *gradient_xpm[3]; gradient_xpm[1] = (char *) malloc(sizeof(char) * (MAX_STR_LEN + 1)); strncpy(gradient_xpm, "jkl", MAX_STR_LEN); // now this will work: gradient_xpm[1][2] = 'x';
Аналогично для gradient_xpm[0]
, gradient_xpm[2]
.
Изменение строковых литералов в C является неопределенным поведением. Так что все может случиться, не обязательно segfault.
Из стандарта C99 , 6.4.5 Строковые литералы 6.4.5 / 6:
Не указано, являются ли эти массивы различными, если их элементы имеют соответствующие значения. Если программа пытается изменить такой массив, поведение не определено.
Вы не можете изменять строковые константы, отмеченные как off-limits. Однако вы можете изменить память, которую вы выделили в куче или стеке. Тем не менее, если вы используете C ++, рассмотрите возможность использования массивов string
classа вместо управления массивами char *
. Проблемы управления памятью намного проще в обращении.
Вы реализовали это с помощью строковых литералов, и вы не можете их изменить
Не редактируйте содержимое – это плохая идея BAD. В некоторых компиляторах это была бы ошибка времени компиляции, поскольку строковые константы – const char *
, в отличие от char*
.
Вместо этого переверните указатель:
gradient_xpm[1] = "jkl";