gpt4 book ai didi

c - 警告 : Assigning to 'struct __bnode *' from 'const BinNode *' (aka 'const struct __bnode *' ) discards qualifiers

转载 作者:行者123 更新时间:2023-11-30 16:31:25 26 4
gpt4 key购买 nike

我正在研究二叉搜索树,并定义了如下所示的结构。

typedef struct __bnode
{
Member data;
struct __bnode *left;
struct __bnode *right;
} BinNode;

我遇到问题的功能是

static void SetBinNode(BinNode *n, const Member *x, const BinNode *left, const BinNode *right)
{
n->data = *x;
n->left = left;
n->right = right;
}

但是我遇到了以下警告:

Assigning to 'struct __bnode *' from 'const BinNode *' (aka 'const struct __bnode *') discards qualifiers

我认为这还没有危险到足以发出警告,但这是因为我遗漏了一些东西。

我错过了什么?

最佳答案

您的代码尝试将 const BinNode * 隐式转换为 BinNode *,并丢弃 const。这是不安全的,因此您会收到警告。

以下是这段代码可能给你带来的影响:

// Let's assume 'typedef int Member;' for simplicity

const BinNode zero = { 0, NULL, NULL };

int main(void) {
BinNode node;
SetBinNode(&node, NULL, &zero, NULL);
node->left->data = 42;
return 0;
}

这里我们有一个全局zero变量,即const

调用 SetBinNode(&node, NULL, &zero, NULL); 没问题; &zero 的类型为 const BinNode *,这正是函数原型(prototype)所说的 SetBinNode 所采用的类型。

node->left->data = 42; 也可以正常编译。 node->left 是一个 BinNode *node->left->data 是一个Member(即我们示例中的int)。

但是这个作业可能会崩溃。调用 SetBinNode 后,node->left 指向 0。因为 zeroconst,编译器可能会将其放入只读内存中。现在,对 node->left->data 的赋值尝试修改 const 变量,从而触发段错误。

所有这一切的发生都没有编译器的提示......除了 SetBinNode 中的一行。

解决方案是将SetBinNode的类型更改为

static void SetBinNode(BinNode *n, const Member *x, BinNode *left, BinNode *right)

即删除const。参数上的 const 做出了它无法兑现的 promise 。即使函数本身不通过 *left*right 写入,它仍然可以通过非常量访问路径提供对象,这可能会在以后造成麻烦。

关于c - 警告 : Assigning to 'struct __bnode *' from 'const BinNode *' (aka 'const struct __bnode *' ) discards qualifiers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50629589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com