为什么 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