使用以下代碼:
char randnum[KEYSIZE 1];
char temp[3];
char buff[KEYSIZE*2 1] = {0};
for (j = 0; i < KEYSIZE; i ) {
randnum[i] = rand()%256;
snprintf(temp, 3, "%.2x", (unsigned char)randnum[i]);
strcat(buff, &temp);
}
我得到incompatible pointer types passing 'char (*)[3]' to parameter of type 'const char *的&temp。這是通過使用temp來解決的。
我正在嘗試理解錯誤訊息。我明白const char *是一個指標,但我不確定char (*)[3]指的是什么;特別是(*). 從我可以從修復中推斷出來,我假設這是一個指向指標的指標(編輯:指標)。這樣對嗎?
uj5u.com熱心網友回復:
&temp是整個陣列的地址。陣列的型別是char [3],所以地址(指標)的型別是指向那個陣列的指標,表示為char (*) [3],讀作“指向3char秒陣列的指標”。
我假設這是一個指向指標的指標。
不,它是指向陣列的指標。
uj5u.com熱心網友回復:
&temp是一個指向陣列本身的指標,它確實有型別char (*)[3](它是一個指向三個char元素的陣列的指標)。
您應該傳遞一個指向字串的第一個元素的指標,即&temp[0],這就是簡單的temp 衰減。
所以:
strcat(buff, temp);
uj5u.com熱心網友回復:
函式strcat宣告如下
char *strcat(char * restrict s1, const char * restrict s2);
正如您所看到的,它的兩個引數都期望型別為char *或 的運算式const char *。
在這個函式呼叫中
strcat(buff, &temp);
char *由于buff宣告的陣列指示符的隱式轉換,第一個引數運算式確實具有型別
char buff[KEYSIZE*2 1] = {0};
指向其第一個元素的指標。
雖然第二個引數運算式具有型別,char ( * )[3]因為您使用&了陣列的運算子地址temp
&temp
您還需要使用陣列指示符作為引數temp。在這種情況下,它將以與陣列類似的方式隱式轉換為指向其第一個元素的指標buff。
strcat(buff, temp);
請注意,最初random應將陣列宣告為具有元素型別unsigned char。
unsigned char randnum[KEYSIZE 1];
此外,由于陣列不是設計為包含字串,因此它也可以宣告為
unsigned char randnum[KEYSIZE];
字符亂數[KEYSIZE 1];
uj5u.com熱心網友回復:
陣列衰減為指標。
char temp[3];
temp衰減到指向char *參考陣列第一個元素的char ( ) 的指標&temp衰減到指向陣列char (*)[3]開頭的3 個字符 ( )陣列的指標&temp[n]衰減到指向char *參考陣列第 n 個元素的char ( ) 的指標
uj5u.com熱心網友回復:
該strcat函式宣告為 (C17 7.24.3.1):
char *strcat(char * restrict s1,
const char * restrict s2);
為了討論起見,重要的部分是函式char*對這兩個引數都期望。雖然我們可以注意到 achar*可以分配給 a const char*,但反過來不行。
如果我們看一下正確的用法,strcat(buff, temp);,那么在那個運算式中buff和temp都是陣列。但是在大多數情況下,當在運算式中使用陣列時,它會“衰減”為指向其第一個元素的指標,char*在這種情況下它變為 a 。
這種“衰減”正式定義為 (C17 6.3.2.1):
除非它是運算
sizeof符的運算元,或一元運算&符,或者是用于初始化陣列的字串文字,否則型別為 ''array of type '' 的運算式將轉換為型別為 ''pointer to type的運算式'' 指向陣列物件的初始元素并且不是左值。
但是,當您鍵入 時&temp,您會偶然發現上述“陣列衰減”規則的例外之一,即與一元&.
因此,char*我們最終得到的不是 a,而是“a 的地址char [3]”。它必須用指向陣列時使用的特殊指標型別來表示char (*)[3],稱為“指向陣列的指標”或“陣列指標”。
C 對隱式指標轉換有非常嚴格的規則——它不會接受將 achar(*)[3]傳遞給預期的引數const char*——它們是不兼容的指標型別——它不是一種有效的賦值形式。
當您了解所有這些后,編譯器錯誤實際上是不言自明的。
uj5u.com熱心網友回復:
char (*)[3] 是一個指向大小為 3 的陣列的指標。
temp最“自然”的形式是 type char[3]。但是,因為temp也指向陣列的第一個元素(即 a char),所以它可以“衰減”為 a char*。
當您使用 時&temp,它給出了temp變數的地址,而不是位于陣列中的地址。同樣,以其最“自然”的形式,&temp是型別,char (*)[3]因為它是指向 a 的指標char[3]。然而,請注意,它不再是一種陣列型(而一個指標到陣列),所以它是不允許的衰減到char**。
strcat(buff, temp);解決這個問題是因為strcat想要一個char*,而不是一個char (*)[3]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338893.html
下一篇:如何使用標準庫將字串轉換為大寫?
