当我宣布一个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