C
让我可以经常互换使用 char
指针和数组,以至于我经常认为它们是完全可以互换的。但是下面的代码证明这是不正确的。谁能解释为什么在下面的代码中使用三元运算符初始化 const char d[]
是非法的?
/* main.c */
#include <stdio.h>
int main()
{
const char* a = "lorem";
const char b[] = "ipsum";
int* p;
const char* c = ( *p ? "dolor" : "sit" );
const char d[] = ( *p ? "amet" : "consectetur" ); // Why am I an error?
return 0;
}
编译:
> gcc -g main.c
main.c: In function \u2018main\u2019:
main.c:10:20: error: invalid initializer
const char d[] = ( *p ? "amet" : "consectetur" ); // Why am I an error?
相关问题:如果我的术语在这里不够精确:描述 const char d[]
的正确术语是什么?它是一个数组吗?变长数组?还有别的吗?它不被视为指针 - 是吗?
编辑:我相信 Array initialization with a ternary operator? 没有回答这个问题
RE:引用问题,我相信前提略有不同。例如。接受的答案解释说 { 1, 2 };
(或 { 'a', 'b' );
)不是有效的 C
表达式,我已经知道并接受了。但是 "amet";
和 "consectetur";
是有效的 C
表达式。
最佳答案
6.7.9 Initialization
...
14 An array of character type may be initialized by a character string literal or UTF−8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.
( *p ? "amet": "consectetur")
不是字符串文字,也评估为字符串文字.它计算为 char *
类型的表达式,它本身不是有效的数组初始值设定项,并且该计算直到运行时才会发生。
更不用说,p
是未初始化的,所以表达式从一开始就是未定义的。
关于c - 为什么用三元运算符初始化数组是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54427661/