有人可以解释为啥会出现这个错误吗?

Posted

技术标签:

【中文标题】有人可以解释为啥会出现这个错误吗?【英文标题】:Can someone explain why this error appears?有人可以解释为什么会出现这个错误吗? 【发布时间】:2022-01-10 11:29:27 【问题描述】:

出现此警告:

f.c:14:16: warning: incompatible pointer to integer conversion assigning to 'char' from 'char [2]' [-Wint-conversion]
    head1 -> data = "K";
                  ^ ~~~

f.c:16:16: warning: incompatible pointer to integer conversion assigning to 'char' from 'char [2]' [-Wint-conversion]
    head2 -> data = "a";
                  ^ ~~~

这是代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct _node 
        char data;
        struct _node *link;
node;

int main ()
        node *head1 = NULL;
        node *head2 = NULL;
        head1 = (node *)malloc (sizeof (node));
        head2 = (node *)malloc (sizeof (node));
        head1 -> data = "K";
        head1 -> link = head2;
        head2 -> data = "a";

        printf("%c%c", head1->data, head2->data);

        return 0;

【问题讨论】:

head1 -&gt; data = "K"; 更改为head1 -&gt; data = 'K'; @RichardCritten 看起来这是通常的“让我们也标记它 C++ 以获得更多答案”的问题。错误信息中的文件名是f.c,所以看起来是个C题。 您是否通过 C++ 编译器运行您的代码?否则请不要标记 C++ 语言。 【参考方案1】:

以下答案假定您需要 C++ 特定的答案。

problem 是 "K" 的类型为 const char[2]。当你写的时候

head1 -> data = "K";

右侧衰减const char*。但请注意,左侧仍然是char。因此,正如错误所说,您无法将 const char* 转换为 char

同样,"a" 的类型为 const char[2]。当你写的时候

head2 -> data = "a";

右侧衰减const char*,但左侧仍为char。由于我们无法将 const char* 转换为 char,因此您会收到上述错误。

您可以解决此问题,方法是将head1 -&gt; data = "K";head2 -&gt; data = "a"; 替换为:

head1 -> data = 'K'; //note single quote around K
head2 -> data = 'a'; //note single quote around a

错误 2

而不是使用malloc,然后像以前那样取消引用head1,您应该使用new,例如:

node *head1 = new node;
node *head2 = new node;

别忘了使用delete堆上分配的内存。所以修改后的程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
typedef struct _node 
        char data;
        struct _node *link;
node;

int main ()
        node *head1 = new node;
        node *head2 = new node;
      
        head1 -> data = 'K';
        head1 -> link = head2;
        head2 -> data = 'a';
        std::cout<<head1->data<<" "<<head2->data;
        
        //DONT FORGET TO DELETE 
        delete head1;
        delete head2;
        return 0;


【讨论】:

char[2] 数组在任何时候都不会衰减为指针;它仍然是类型为char[2] 的右值。去掉关于衰变的不正确信息,答案是正确的。【参考方案2】:

data 是一个char 变量,使用简单的括号:' '

head1 -&gt; data = "K"; -> 错误

head1 -&gt; data = 'K'; -> 好的

同时使用 new 而不是 malloc,几乎任何事情都不要使用 malloc:

错误:

head1 = (node *)malloc (sizeof (node));
head2 = (node *)malloc (sizeof (node));

好的:

head1 = new Node;
head2 = new Node;

【讨论】:

为什么我不能使用malloc?我可以使用 malloc 来存储整数吗? @Kamol 基本上是因为 malloc 来自 C 而不是 C++ ,所以它有一些不足。即使您可以在 C++ 中使用malloc,new 也更好。如果您想了解更多详细信息,请查看以下问题:***.com/q/184537/17308658 @Kamol 我刚刚意识到它是一个 C 程序,并且你标记了 C++。不要这样做以获得更多答案。反正我说的new只适用于C++。

以上是关于有人可以解释为啥会出现这个错误吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 fclose 上出现段错误?

请有人可以解释为啥我在下面收到错误消息?

请查看下面的程序并解释为啥会出现错误

有人能解释一下猪的这个奇怪的错误吗

为啥颤振本地通知会出现异常

在 c++ 程序中调试链接列表以添加两个数字:有人可以解释为啥 l3=l3->next;导致错误?