ANSI C:指向字符串文字的指针

pet*_*zik 4 c string-literals

可能重复:
字符串文字是否为常量?

以下是否在ANSI C中有效?

#include <stdio.h>

/* This returns "Hans" if arg != 0, "Gretel" if arg == 0 */
char* foo(int arg)
{
    return arg ? "Hans" : "Gretel";
}

int main()
{
    char* p_ch;

    p_ch = foo(1);
    printf("%s\n", p_ch);
    p_ch = foo(0);
    printf("%s\n", p_ch);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该代码在GCC/Linux下编译并运行良好.

MinGW/Windows说:

invalid conversion from `const char*' to `char*'
Run Code Online (Sandbox Code Playgroud)

MS Visual C/C++ 2008对代码很好.

  1. 我可以将char*变量分配给文本字符串,而不是在初始化时吗?
  2. 我已经读过字符串文字有static位置类.这是否意味着它们在定义的函数之外是不可见的?
  3. const类型到非const对应的转换何时无效?

Fre*_*Foo 5

是的,这是有效的标准C.但是,它只是有效的,因为字符串文字具有char[]向后兼容性的类型; 你应该做的返回值从foo一个const char*安全.写入任何返回的字符串都会foo引发未定义的行为.

如果您的编译器抱怨这一点,那么您可能不小心使用了C++编译器.在C++中,字符串文字具有类型const char [].(如果更改char*const char*,您的程序也会神奇地成为有效的C++程序.)

我可以将char*变量分配给文本字符串,而不是在初始化时吗?

你的意思是

char *p;
// do some other stuff
p = "literal";
Run Code Online (Sandbox Code Playgroud)

?是的,这是可能的.

我已经读过字符串文字有静态分配类.这是否意味着它们在定义的函数之外是不可见的?

你会混淆静态分配和static变量.您当然可以foo在另一个翻译单元中使用结果.

从const类型到非const对应的转换何时无效?

正式自1989年以来,当const被介绍给C.你必须明确地抛弃它const.