Измените массив char *

У меня есть массив 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";