有人可以解释为什么这个简单的三元运算在 C 中甚至无法编译吗?
void main(int argc, char *argv[]){
int a = atoi(argv[1]);
char foo[] = (a == 1) ? "bar1" : "bar2";
}
特别是字符串似乎是一个问题。
有人可以解释为什么这个简单的三元运算在 C 中甚至无法编译吗?
void main(int argc, char *argv[]){
int a = atoi(argv[1]);
char foo[] = (a == 1) ? "bar1" : "bar2";
}
特别是字符串似乎是一个问题。
字符串文字"bar"
,当在表达式中使用时(在这种情况下,在三元运算符内),是指向预分配内存的指针。您不能使用指向数据的指针来初始化数组,只能使用文字("..."
或{...}
)。
相反,您可以将其分配给char *
:
const char *foo = (a == 1) ? "bar1" : "bar2";
这不会复制文字而是指向它,所以你不应该修改foo
. 如果您需要一个副本,您可以使用memcpy
,前提是您知道声明数组的大小:
char foo[5];
memcpy(foo, (a == 1) ? "bar1" : "bar2", sizeof foo);
如果您特别希望能够分配内容,那么有一个技巧可以做到这一点;无论包含什么内容,都可以隐式复制struct
using 赋值的内容(以及从函数中返回它等等),struct
并且您可以将字符数组放在 a 中struct
:
typedef struct {
char contents[5];
} mystring;
mystring foo = (a == 1) ? (mystring){"bar1"} : (mystring){"bar2"};
// You can also use assignments.
foo = (mystring){"baz"};
就像第二个选项一样,当你这样做时,你必须在struct
声明中为数组选择一个固定大小。如果你有无限长度的字符串,那么你必须使用指针。
您的三元运算很好,但是您无法使用“bar1”和“bar2”所在的预分配内存来初始化数组。
int a = atoi(argv[1]);
char foo[5];
memcpy(foo,((a == 1) ? "bar1" : "bar2"), 5);
将是一种可能的方式来继续做你正在做的事情。