为什么C的strcpy会因双重索引数组而失败?

con*_*ter 3 c arrays pointers cstring strcpy

以下代码似乎是段错误,我无法弄清楚原因.

#include <string.h>

static char src[] = "aaa";

int main()
{
   char* target[2] = {"cccc","bbbbbbbbbb"};
   strcpy(target[1],src);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 11

因为target[1]是一个指针"bbbbbbbbbb",你不能修改字符串常量.这是未定义的行为.

它与以下内容没有什么不同:

char *x = "bbb";
x[0] = 'a';
Run Code Online (Sandbox Code Playgroud)

我想你可能会混淆它:

char x[] = "bbb";
x[0] = 'a';
Run Code Online (Sandbox Code Playgroud)

有效的,因为它创建了一个允许您修改的数组.但是你的东西给了你:

char* target[2] = {"cccc","bbbbbbbbbb"};
Run Code Online (Sandbox Code Playgroud)

是一个指针数组,所有这些都指向不可修改的内存.

如果您尝试:

char t0[] = "cccc";
char t1[] = "bbbbbbbbbb";
char* target[2] = {t0, t1};
strcpy(target[1],src);
Run Code Online (Sandbox Code Playgroud)

你会发现它target[1]现在有效t1,可以修改.

  • @confused:如果有效,那纯粹是偶然的.它是_still_未定义的行为,你不应该这样做,因为_anything_可能发生 - 有时"任何东西"可能是它只是工作,但切换到不同的系统,编译器,或编译器标志,甚至在晚上9点后运行或在蓝色月亮可能会导致您的代码崩溃.例如,_exact_代码在我的Ubuntu 10.04框上导致"分段错误". (4认同)