警告:赋值从指针生成整数而不进行强制转换
当我将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";
编译器看到常量字符串"abcdefghijklmnop"
就像一个数组。 想象一下,您已经编写了以下代码:
char otherstring[14] = "anotherstring"; ... *src = otherstring;
现在,它发生了什么更清楚。 左边的*src
引用一个char
(因为src
的类型是指向char
的类型),而右边的otherstring
引用一个指针。
这不是严格禁止的,因为您可能希望存储指针指向的地址。 但是,在这种情况下通常使用显式强制转换(这种情况并不常见)。 编译器会抛出一个红色标记,因为您的代码可能没有按照您的想法执行。
在我看来,你正在尝试分配一个字符串。 C中的字符串不是像C ++中那样的数据类型,而是使用char
数组实现。 您无法直接将值分配给字符串,就像您尝试的那样。 相反,您需要使用strncpy
和
朋友之类的函数,并使用char
数组而不是char
指针。 如果您只希望指针指向不同的静态字符串,则删除*
。
警告来自您在分配中取消引用src
的事实。 表达式*src
类型为char
,它是一个整数类型。 表达式"anotherstring"
具有char [14]
类型,在此特定上下文中,它隐式转换为char *
类型,其值是数组中第一个字符的地址。 因此,您最终尝试将指针值分配给整数类型,因此警告。 从*src
删除*
,它应该按预期工作:
src = "anotherstring";
因为src
的类型是char *
。
耶利米所说的,加上编译器发出警告,因为制作:
* src =“anotherstring”;
说:取“anotherstring”的地址 – “anotherstring”是一个char指针 – 并通过src(* src = …)间接存储指针到字符串“abcdef …”的第一个字符串中警告可能令人困惑,因为你的代码中没有任何地方提到任何整数:警告似乎是荒谬的。 但是,在幕后看不见的是“int”和“char”在存储方面是同义词的规则:两者占据相同的位数。 编译器在发出存储为整数的警告时不会区分。 哪个,BTW,完全可以合法,但可能不完全是你想要的代码。
– 皮特