2011-02-25 76 views
17

當我宣佈一個char *到一個固定的字符串和重用的指針指向另一個字符串警告:賦值時將指針整數,未作鑄

/* initial declaration */ 
char *src = "abcdefghijklmnop"; 
..... 

/* I get the "warning: assignment makes integer from pointer without a cast" */ 
*src ="anotherstring"; 

我試圖重鑄指針,但沒有成功。

+3

在C中不建議使用非const char *來指向字符串常量 - 您應該將'src'更改爲'const char *'類型。 – 2011-02-25 20:42:20

回答

29

表達式*src引用字符串中的第一個字符,而不是整個字符串。要重新指派src指向不同的字符串tgt,請使用src = tgt;

0

什麼耶利米說,再加上編譯器會發出警告,因爲生產:

*src ="anotherstring";

說:採取「anotherstring」地址 - 「anotherstring」是一個字符指針 - 和存儲,通過間接指針src(* src = ...)插入到字符串「abcdef ...」的第一個字符中。警告可能令人困惑,因爲代碼中沒有提及任何整數:警告看起來毫無意義。但是,在幕後看不見的是,「int」和「char」在存儲方面是同義詞:都佔用相同的位數。編譯器不會區分何時將警告存儲到整數中。順便說一句,順便說一句,這是完全合法的,但可能不完全符合你想要的代碼。

- 皮特

+0

'int'和'char'通常沒有相同的位數。在整個C歷史中,char通常爲8位,int保證至少爲16,更可能是32或更多。它們都是整型,因此「整數」可能意味着它們中的任何一個。但是,當引用的「整數」是「char」時,這有點令人驚訝。 – 2011-02-25 21:38:40

24

當你寫的聲明

*src = "anotherstring"; 

編譯器看到常量字符串"abcdefghijklmnop"像數組。想象一下,你已經寫下了下面的代碼:

char otherstring[14] = "anotherstring"; 
... 
*src = otherstring; 

現在,它有點更清楚發生了什麼。左邊的*src指的是char(因爲src是指針類型指針),而右邊的otherstring指的是指針。

這不是嚴格禁止的,因爲您可能想要存儲指針指向的地址。然而,在這種情況下通常使用明確的轉換(這不是太常見)。編譯器正在拋出一個紅旗,因爲你的代碼可能不會做你認爲的事情。

在我看來,你正試圖分配一個字符串。 C中的字符串不像C++中的數據類型,而是使用char數組實現。您不能像您正在嘗試的那樣直接將值分配給字符串。相反,您需要使用像strncpy<string.h>的朋友的功能,並使用char陣列而不是char指針。如果您只想讓指針指向不同的靜態字符串,則刪除*

4

警告來自於您在引用中取消引用src的事實。表達式*src具有類型char,這是一個整數類型。表達式"anotherstring"的類型爲char [14],它在此特定上下文中隱式轉換爲char *類型,其值是數組中第一個字符的地址。所以,你最終試圖將一個指針值賦給一個整型,因此是警告。從*src刪除該*,並預期它應該工作:

src = "anotherstring"; 

src類型是char *

相關問題