c - 为什么在这种情况下需要取消引用 char?

标签 c pointers char dereference

我一直在本科类(class)中用 C 语言进行树的一些练习,得到了非常奇怪的结果。

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

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]。

预先感谢您的帮助。

最佳答案

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

关于c - 为什么在这种情况下需要取消引用 char?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56346959/

相关文章:

c++ - 错误 : Undefined first referenced symbol in file

java - 使用 toCharArray() 的字符串文字在 Java 中产生垃圾

java打印字符数组

c - Getchar在c中只保存1个字符

c++ - 分支预测和分支目标预测优化

c++ - OpenGL——多个 glDrawArrays() 调用只显示第一次的结果?

C++:如何将 memcpy 与指针 ** 一起使用?

c - 数组指针编译时警告 : warning: initialization from incompatible pointer type

c++ - 以这种方式初始化的 char 数组是否自动添加了空终止符?

c - MPLab的C编译器问题