當我宣佈一個char *
到一個固定的字符串和重用的指針指向另一個字符串警告:賦值時將指針整數,未作鑄
/* initial declaration */
char *src = "abcdefghijklmnop";
.....
/* I get the "warning: assignment makes integer from pointer without a cast" */
*src ="anotherstring";
我試圖重鑄指針,但沒有成功。
當我宣佈一個char *
到一個固定的字符串和重用的指針指向另一個字符串警告:賦值時將指針整數,未作鑄
/* initial declaration */
char *src = "abcdefghijklmnop";
.....
/* I get the "warning: assignment makes integer from pointer without a cast" */
*src ="anotherstring";
我試圖重鑄指針,但沒有成功。
表達式*src
引用字符串中的第一個字符,而不是整個字符串。要重新指派src
指向不同的字符串tgt
,請使用src = tgt;
。
什麼耶利米說,再加上編譯器會發出警告,因爲生產:
*src ="anotherstring";
說:採取「anotherstring」地址 - 「anotherstring」是一個字符指針 - 和存儲,通過間接指針src(* src = ...)插入到字符串「abcdef ...」的第一個字符中。警告可能令人困惑,因爲代碼中沒有提及任何整數:警告看起來毫無意義。但是,在幕後看不見的是,「int」和「char」在存儲方面是同義詞:都佔用相同的位數。編譯器不會區分何時將警告存儲到整數中。順便說一句,順便說一句,這是完全合法的,但可能不完全符合你想要的代碼。
- 皮特
'int'和'char'通常沒有相同的位數。在整個C歷史中,char通常爲8位,int保證至少爲16,更可能是32或更多。它們都是整型,因此「整數」可能意味着它們中的任何一個。但是,當引用的「整數」是「char」時,這有點令人驚訝。 – 2011-02-25 21:38:40
當你寫的聲明
*src = "anotherstring";
編譯器看到常量字符串"abcdefghijklmnop"
像數組。想象一下,你已經寫下了下面的代碼:
char otherstring[14] = "anotherstring";
...
*src = otherstring;
現在,它有點更清楚發生了什麼。左邊的*src
指的是char
(因爲src
是指針類型指針),而右邊的otherstring
指的是指針。
這不是嚴格禁止的,因爲您可能想要存儲指針指向的地址。然而,在這種情況下通常使用明確的轉換(這不是太常見)。編譯器正在拋出一個紅旗,因爲你的代碼可能不會做你認爲的事情。
在我看來,你正試圖分配一個字符串。 C中的字符串不像C++中的數據類型,而是使用char
數組實現。您不能像您正在嘗試的那樣直接將值分配給字符串。相反,您需要使用像strncpy
和<string.h>
的朋友的功能,並使用char
陣列而不是char
指針。如果您只想讓指針指向不同的靜態字符串,則刪除*
。
警告來自於您在引用中取消引用src
的事實。表達式*src
具有類型char
,這是一個整數類型。表達式"anotherstring"
的類型爲char [14]
,它在此特定上下文中隱式轉換爲char *
類型,其值是數組中第一個字符的地址。所以,你最終試圖將一個指針值賦給一個整型,因此是警告。從*src
刪除該*
,並預期它應該工作:
src = "anotherstring";
自src
類型是char *
。
在C中不建議使用非const char *來指向字符串常量 - 您應該將'src'更改爲'const char *'類型。 – 2011-02-25 20:42:20