为什么在这种情况下必须取消引用char?

时间:2019-05-28 16:57:57

标签: c pointers char dereference

在我的本科课程中,我一直在用C进行树木练习,结果却很奇怪。

这是未按预期输出的代码。我有一棵树,其根是struct node * root,而preorder函数将数据打印到树上的每个节点上。

struct node{
    char data;
    struct node * left;
    struct node * right;
};

struct node* newNode(char data){
    struct node* node = malloc(sizeof(struct node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return(node);
}

void preorder(struct node * root){
    //struct node * start = root;
    struct node * L;
    struct node * R;
    if(root!=NULL){
        printf("%c",root->data);
        preorder(root->left);
        preorder(root->right);
    }
}

int main(){
    struct node * root = newNode("a");
    root->left = newNode("b");
    root->right = newNode("c");
    root->left->left = newNode("d");
    root->left->right = newNode("e");
    root->right->left = newNode("f");
    root->right->right = newNode("g");
    preorder(root);
    return 0;
}

我原本希望输出是“ abdecfg”,但是终端却输出了一个奇怪的结果,就像这样; https://i.imgur.com/LudpUn7.png。 我收到GCC警告“ [警告]赋值从指针进行整数转换而没有强制转换”,但是我不明白为什么。 如果在char输入上使用取消引用星号,则错误停止,并且我得到了预期的输出,如下所示;

int main(){
    struct node * root = newNode(*"a");
    root->left = newNode(*"b");
    root->right = newNode(*"c");
    root->left->left = newNode(*"d");
    root->left->right = newNode(*"e");
    root->right->left = newNode(*"f");
    root->right->right = newNode(*"g");
    preorder(root);
    return 0;
}

请注意,如果我将取消引用星号放在newNode输入上,则它不起作用[1]。

在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

C中的

双引号(")表示字符串,它们变成char *(指针)。您希望单引号(')获得字符常量。

答案 1 :(得分:-1)

您正在尝试从字符串(“”)转换为char('')。字符串是const char *或char数组,或一堆字符。只需切换:

struct node * root = newNode("a");

收件人

struct node * root = newNode('a');

以此类推,适用于所有构造函数。