警告:赋值从指针生成整数而没有强制转换

时间:2011-02-25 20:25:13

标签: c casting

当我向固定字符串声明char *并重用指针指向另一个字符串时

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

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

我试图重新制作指针,但没有成功。

4 个答案:

答案 0 :(得分:31)

表达式*src是指字符串中的第一个字符,而不是整个字符串。要重新指定src以指向其他字符串tgt,请使用src = tgt;

答案 1 :(得分:29)

撰写声明时

*src = "anotherstring";

编译器将常量字符串"abcdefghijklmnop"看作数组。想象一下,您已经编写了以下代码:

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

现在,发生的事情更加清晰。左侧*src指的是char(因为src的类型是指向 - char),而右侧是{{1} },指的是一个指针。

这不是严格禁止的,因为您可能希望存储指针指向的地址。但是,在这种情况下通常使用显式强制转换(这种情况并不常见)。编译器会抛出一个红色标记,因为你的代码可能没有按照你的想法行事。

在我看来,你正试图分配一个字符串。 C中的字符串不是像C ++中那样的数据类型,而是使用otherstring数组实现。您无法直接将值分配给字符串,就像您尝试的那样。相反,您需要使用char等功能和strncpy中的朋友,并使用<string.h>数组而不是char指针。如果您只希望指针指向不同的静态字符串,请删除char

答案 2 :(得分:5)

警告来自您在作业中取消引用src的事实。表达式*src具有类型char,这是一个整数类型。表达式"anotherstring"具有类型char [14],在此特定上下文中,它隐式转换为类型char *,其值是数组中第一个字符的地址。因此,您最终尝试将指针值分配给整数类型,因此警告。从*删除*src,它应该按预期工作:

src = "anotherstring";

因为src的类型是char *

答案 3 :(得分:0)

Jeremiah说了什么,加上编译器发出警告,因为制作:

*src ="anotherstring";

说:取“anotherstring”的地址 - “anotherstring”是一个char指针 - 并将指针通过src(* src = ...)间接存储到字符串“abcdef ...的第一个字符串中... “警告可能令人困惑,因为你的代码中没有任何地方提到任何整数:警告似乎是荒谬的。但是,在幕后看不见的是“int”和“char”在存储方面是同义词的规则:两者占据相同的位数。编译器在发出存储为整数的警告时不区分。 BTW,完全可以合法,但可能不是你想要的代码。

- 皮特