为什么C编译器允许我使用strcpy来覆盖字符串文字?

时间:2018-04-14 17:21:15

标签: c c-strings strcpy

为什么以下代码在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

1 个答案:

答案 0 :(得分:2)

C99字符串文字是char[],但修改数组是未定义的行为,请参阅What is the type of string literals in C and C++?

许多编译器都可以选择为非常量使用启用警告,例如gcc' -Wwrite-strings