代码之家  ›  专栏  ›  技术社区  ›  TanM

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

  •  0
  • TanM  · 技术社区  · 6 年前

    为什么下面的代码在Visual Studio中工作?

    char* str1 = "This is a test string";
    strcpy_s(str1, strlen(str1), "replacing content");
    

    我的理解是,str1只是一个指向字符串文字的字符*,而不是一个字符数组。 在strcpy\u s()或strcpy()中,字符字节从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 回复  |  直到 6 年前
        1
  •  2
  •   Janne Husberg    6 年前

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

    许多编译器都有启用非常量使用警告的选项,例如gcc -Wwrite-strings