0

我有一个这样的数组char *

char * gradient_xpm[] = {"abc", "def", "ghi"};

我需要更改这些字符串的值。

我已经尝试strcpy=操作员,但它给了我一个分段错误。

例如:

strcpy(gradient_xpm[1],"jkl");
gradient_xpm[1][2] = 'x';

我什至无法编辑一个字符。如何编辑这些值?

4

5 回答 5

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]

于 2012-06-15T21:11:06.873 回答
3

在 C 中修改字符串文字是未定义的行为。所以任何事情都可能发生,不一定是段错误。

C99 标准,6.4.5 字符串文字 6.4.5/6:

如果它们的元素具有适当的值,则未指定这些数组是否不同。如果程序尝试修改这样的数组,则行为未定义。

于 2012-06-15T21:20:31.843 回答
1

您不能修改标记为禁止使用的字符串常量。但是,您可以修改在堆或堆栈上分配的内存。也就是说,如果您使用 C++,请考虑使用string数组,而不是管理char *数组。内存管理问题更容易处理。

于 2012-06-15T21:15:09.423 回答
0

您已经使用字符串文字实现了这一点,并且无法更改它们

于 2012-06-15T21:13:48.183 回答
0

不要编辑内容 - 这是一个坏主意。在某些编译器中,这将是一个编译时错误,因为字符串常量是const char *,而不是char*.

相反,翻转指针:

gradient_xpm[1] = "jkl"; 
于 2012-06-15T21:14:38.467 回答