我有一个char *
数组,如下所示:
char * gradient_xpm[] = {"abc", "def", "ghi"};
我需要更改这些字符串的值。
我尝试了strcpy
和=
运算符,但它给了我一个分段错误。
e.g:
strcpy(gradient_xpm[1],"jkl");
gradient_xpm[1][2] = 'x';
我甚至无法编辑单个字符。如何编辑这些值?
答案 0 :(得分:4)
数组中有字符串常量,无法更改。这是您的段错误的原因。
您需要在不使用字符串常量的情况下设置数组,然后将字符串常量复制到数组中。
类似的东西:
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]
。
答案 1 :(得分:3)
在C中修改字符串文字是未定义的行为。所以任何事情都可能发生,不一定是段错误。
来自C99 standard,6.4.5字符串文字6.4.5 / 6:
未指明这些数组是否与它们不同 元素具有适当的值。如果程序试图 修改这样的数组,行为是未定义的。
答案 2 :(得分:1)
您无法修改标记为禁止的字符串常量。但是,您可以修改已在堆或堆栈上分配的内存。也就是说,如果您使用的是C ++,请考虑使用the string
class数组,而不是管理char *
数组。内存管理问题更容易处理。
答案 3 :(得分:0)
您已使用字符串文字实现此功能,但您无法更改它们
答案 4 :(得分:0)
不要编辑内容 - 这是一个糟糕的,不好的想法。在某些编译器中,这是一个编译时错误,因为字符串常量是const char *
,而不是char*
。
相反,翻转指针:
gradient_xpm[1] = "jkl";