[英]Is using split declaration for char* array c99 compatible?
我一直在 c 中對字符串 arrays 使用拆分聲明/分配,如下所示:
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]
; 您沒有將字符串"some string"
存儲到str_array
。
如果這就是你想要完成的事情,那是完全有效的。 您可以擁有指向字符串的整個指針數組:
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]
(12 個char
元素數組) - 因為它不用於在聲明中初始化字符類型數組,所以它“衰減”為char *
類型的表達式(指向char
的指針),它的值是第一個字符's'
的地址。
如果你寫過
char str_array[] = "some string"; // note type of str_array
然后"some string"
的內容將被復制到str_array
(其大小將根據初始化程序的長度計算)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.