为什么 C 编译器允许我使用 strcpy 来覆盖字符串文字?
Why does the C compiler allow me to use strcpy to overwrite string literal?
为什么下面的代码在 Visual Studio 中有效?
char* str1 = "This is a test string";
strcpy_s(str1, strlen(str1), "replacing content");
我的理解是 str1 只是一个 char* 指向一个字符串文字,而不是一个字符数组。
在 strcpy_s()(或 strcpy())中,char 字节从 src 复制到 dst 数组。
在上面的代码中,strcpy() 不是试图覆盖字符串文字吗?如果是,那么为什么要编译代码?
附加信息
不仅代码在编译,我还可以看到新字符串被复制了。
void stringCopy_demo() {
char* str1 = "1234567890"; //len = 10
printf("%s \n", str1);
strcpy_s(str1, strlen(str1), "content");
printf("%s \n", str1);
}
输出
1234567890
content
C99 字符串文字是 char[]
,但修改数组是未定义的行为,请参阅 C 和 C++ 中字符串文字的类型是什么?
。
许多编译器都可以选择为非常量使用启用警告,例如 gcc 的 -Wwrite-strings
为什么下面的代码在 Visual Studio 中有效?
char* str1 = "This is a test string";
strcpy_s(str1, strlen(str1), "replacing content");
我的理解是 str1 只是一个 char* 指向一个字符串文字,而不是一个字符数组。 在 strcpy_s()(或 strcpy())中,char 字节从 src 复制到 dst 数组。
在上面的代码中,strcpy() 不是试图覆盖字符串文字吗?如果是,那么为什么要编译代码?
附加信息
不仅代码在编译,我还可以看到新字符串被复制了。
void stringCopy_demo() {
char* str1 = "1234567890"; //len = 10
printf("%s \n", str1);
strcpy_s(str1, strlen(str1), "content");
printf("%s \n", str1);
}
输出
1234567890
content
C99 字符串文字是 char[]
,但修改数组是未定义的行为,请参阅 C 和 C++ 中字符串文字的类型是什么?
。
许多编译器都可以选择为非常量使用启用警告,例如 gcc 的 -Wwrite-strings