2011-02-25 141 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 *

相关问题