字符串文字与C中的const char*

Rob*_*bin 10 c

为什么ANSI C编译器不会在函数调用中标记字符串文字参数的使用,其中相关参数没有const限定符?例如,以下代码可以通过尝试写入只读内存来生成异常.

void somefunc(char buffer[10]);

void somefunc(char buffer[10]) {
    int i;

    for (i = 0;   i < 10;   i++)
       buffer[i] = 0;
}

int main(int argc, char **argv) {

    somefunc("Literal");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这种情况可以在编译时识别,但VS2010和gcc似乎没有这样做.使用const char*参数调用somefunc将生成编译器警告.

Han*_*ant 16

这是K&R的遗产.修复它将打破一百万个程序.


Juk*_*ela 11

gcc:使用标志 -Wwrite-strings

PS.gcc手册解释了为什么这不是-Wall的一部分.无论如何,一如既往,您应该找到适合您特定需求和编码风格的-W标志组合.例如,在最近的一个项目中,我使用过这样的东西:-Werror -Wall -Wextra -Wformat=2 -Winit-self -Wswitch-enum -Wstrict-aliasing=2 -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wdisabled-optimization -Wunused-macros -Wno-unused


nin*_*alj 7

汉斯帕斯特说的话.const是作为1989年ANSI标准的一部分添加的,因此之前的任何东西都没有const.


fra*_*nkc 6

字符串文字在C中不是const; 在C++中他们是.

编辑:清除对我的评论的任何困惑,我指的是类型,而不是实际更改它们的能力.

  • @Paul,他是对的.C99§6.4.5/ 5:"对于字符串文字,数组元素的类型为`char`"修改字符串文字是未定义的,但元素类型是`char`,而不是`const char`. (2认同)