定义以下变量:
char *name1 = "Allan";
char name2[] = "Marco";
printf("%s %sn", name1, name2); // Allan Marco
然后以下代码工作正常:
strcpy(name2, name1);
printf("%s %sn", name1, name2); // Allan Allan
但颠倒这些参数会破坏字符串:
strcpy(name1, name2);
printf("%s %sn", name1, name2); // Does not work!
为什么这不起作用?name1
和name2
的求值都指向它们各自字符串的第一个元素的指针,那么为什么strcpy
会区分这两个变量呢?此外,为什么它不起作用?
在这个调用中
strcpy(name1, name2);
您正试图更改指针name1
所指向的字符串文字。
char *name1 = "Allan";
任何更改字符串文字的尝试都会导致未定义的行为。
来自C标准(6.4.5字符串文字(
7未指定这些数组是否不同元素具有适当的值如果程序试图修改这样的数组,行为是未定义的
关于此调用
strcpy(name2, name1);
然后有一个像一样声明的字符数组的重写元素
char name2[] = "Marco";
C中的所有文字字符串实际上都是以null结尾的char
数组,并且您的指针name1
指向这样一个数组的第一个元素。
问题是不允许修改文本字符串的数组,它本质上是只读的。试图修改文字字符串会导致未定义的行为。
这就是为什么建议使用const char *
来指向文字字符串。
另一个重要注意事项:变量name2
是而不是指针,它是一个实际的数组。它可以衰减到指针(指向它的第一个元素(。