警告:赋值从指针生成整数而不进行强制转换

当我将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,完全可以合法,但可能不完全是你想要的代码。

– 皮特