【问题标题】:warning: assignment makes integer from pointer without a cast警告:赋值从没有强制转换的指针生成整数
【发布时间】:2011-07-04 13:56:26
【问题描述】:

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

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

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

我试图重铸指针但没有成功。

【问题讨论】:

  • 在 C 中不推荐使用非 const char* 指向字符串常量——您应该将 src 更改为 const char* 类型。

标签: c casting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    耶利米所说的,加上编译器发出警告,因为生产: <pre>*src ="anotherstring";</pre>

    说:获取“anotherstring”的地址——“anotherstring”是一个字符指针——并通过 src (*src = ... ) 将该指针间接存储到字符串“abcdef... " 该警告可能令人费解,因为您的代码中没有任何地方提及任何整数:该警告似乎毫无意义。但是,在幕后,“int”和“char”在存储方面是同义词的规则是:两者占用相同的位数。编译器在发出您存储到整数中的警告时不会区分。顺便说一句,这完全可以且合法,但可能不完全符合您在此代码中想要的内容。

    --皮特

    【讨论】:

    • intchar 通常没有相同的位数。 char 在 C 的整个历史中通常是 8 位,int 保证至少是 16,更有可能是 32 或更多。它们都是整数类型,因此“整数”可能意味着它们中的任何一个。不过,当引用的“整数”是 char 时,这有点令人惊讶。
    【解决方案3】:

    当你写声明时

    *src = "anotherstring";
    

    编译器将常量字符串"abcdefghijklmnop" 视为一个数组。假设您已经编写了以下代码:

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

    现在,发生了什么事情更清楚了。左侧*src 指的是char(因为src 的类型是指向char 的指针),而右侧otherstring 指的是一个指针。

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

    在我看来,您正在尝试分配一个字符串。 C 中的字符串不是 C++ 中的数据类型,而是使用 char 数组实现的。您不能像您尝试做的那样直接将值分配给字符串。相反,您需要使用 strncpy 之类的函数和来自 &lt;string.h&gt; 的朋友,并使用 char 数组而不是 char 指针。如果您只想让指针指向不同的静态字符串,请删除 *

    【讨论】:

      【解决方案4】:

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

      src = "anotherstring";
      

      因为src 的类型是char *

      【讨论】:

        猜你喜欢
        • 2015-10-19
        • 2013-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-21
        相关资源
        最近更新 更多