是否对 char* 数组 c99 兼容使用拆分声明?

Is using split declaration for char* array c99 compatible?

我一直在 c 中对字符串数组使用拆分 declaration/assignments,如下所示:

size_t arraysize = 2; // some arbitrary value - doesn't matter
char* str_array[arraysize];
int condition = 1; // some condition variable that is set earlier.
if (condition == 0) {
    str_array[0] = "hello";
    str_array[1] = "sir";
}
else {
    str_array[0] = "basketball";
    str_array[1] = "court";
}

size_t arraysize = 2; // some arbitrary value - doesn't matter
char** str_array = malloc(sizeof(char*)*arraysize);
int condition = 1; // some condition variable that is set earlier.
if (condition == 0) {
    str_array[0] = "hello";
    str_array[1] = "sir";
}
else {
    str_array[0] = "basketball";
    str_array[1] = "court";
}
// free str_array somewhere down the line

有一段时间了,但有人问我“那个 c99 兼容吗?”,我对此没有很好的回应。我喜欢这样做的主要原因是因为我可能不知道初始化指针时要使用的字符串的大小(不同条件变量值的字符串大小不同)。我应该担心这种做法(也就是有更好的方法来完成同样的事情)还是真的无关紧要?

char* str_array[10];
str_array[0] = "some string";

您意识到您正在将 "some string" 的第一个字符的 地址 存储到 str_array[0];您没有将 string "some string" 存储到 str_array.

这是完全有效的 if 这就是您想要完成的。您可以拥有一整组指向字符串的指针:

char *str_array[10];

str_array[0] = "some string";
str_array[1] = "some other string";
str_array[2] = "yet another string";
...

但是每个str_array[i]只存储字符串文字的地址,而不是字符串本身。

除非它是 sizeof 或一元 & 运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,表达式 类型“T 的 N 元素数组”将被转换(“衰减”)为类型“指向 T”的表达式,表达式的值将是地址数组的第一个元素。

表达式 "some string" 的类型为 char [12]char 的 12 元素数组)- 因为它没有被用于在声明中初始化字符类型的数组,所以它“衰减”为 char * 类型的表达式(指向 char 的指针),其值是第一个字符的地址 's'.

如果你写了

char str_array[] = "some string"; // note type of str_array

然后 "some string"contents 将被复制到 str_array (其大小将根据初始化程序的长度计算)。