将初始化器强制转换为指针

use*_*309 5 c casting initialization

为什么这不起作用?是否可以进行一些创意铸造以使其发挥作用?

1: const char* yo1 = "abc";
2: const char* yo2 = { 'a', 'b', 'c', '\0' }; // <-- why can't i do this?
3: printf("%s %s\n", yo1, yo2);
Run Code Online (Sandbox Code Playgroud)

结果:分段错误

第2行没有按照我的预期做.

oua*_*uah 5

你可以做:

const char* yo2 = (char [4]) { 'a', 'b', 'c', '\0' };
Run Code Online (Sandbox Code Playgroud)

这是有效的,将实现你想要的.请注意,它不等同于:

const char* yo2 = "abc":
Run Code Online (Sandbox Code Playgroud)

在前一种情况下,when yo2在文件范围内声明:复合文字数组具有静态存储持续时间,但是当yo2在块范围内声明时,复合文字具有自动存储持续时间.

在后一种情况下,"abc"是字符串文字并具有静态存储持续时间(文件范围或块范围).

您还可以使用数组而不是指针:

 const char yo2[] = { 'a', 'b', 'c', '\0' };
Run Code Online (Sandbox Code Playgroud)

关于你的例子.在C:

const char* yo2 = { 'a', 'b', 'c', '\0' };
Run Code Online (Sandbox Code Playgroud)

无效,您的编译器将其解释为:

const char* yo2 = (char *) 'a';
Run Code Online (Sandbox Code Playgroud)

'a'不是指针值(地址),因此解除引用会yo2调用未定义的行为.

  • @nneonneo这个问题被标记为C所以我回答它C. C和C++是两种不同的语言. (3认同)