以下代码似乎是段错误,我无法弄清楚原因。
#include <string.h>
static char src[] = "aaa";
int main()
{
char* target[2] = {"cccc","bbbbbbbbbb"};
strcpy(target[1],src);
return 0;
}
答案 0 :(得分:11)
因为target[1]
是指向"bbbbbbbbbb"
的指针,并且不允许修改字符串常量。这是未定义的行为。
与以下内容没有什么不同:
char *x = "bbb";
x[0] = 'a';
我认为可能会将其混淆:
char x[] = "bbb";
x[0] = 'a';
有效,因为它创建了一个允许修改的数组。但是你的东西给了你:
char* target[2] = {"cccc","bbbbbbbbbb"};
是一个指针数组,所有指针都指向不可修改的内存。
如果您尝试:
char t0[] = "cccc";
char t1[] = "bbbbbbbbbb";
char* target[2] = {t0, t1};
strcpy(target[1],src);
你会发现它有效,因为target[1]
现在指向t1
,这是可修改的。