警告:分配给';结构节点*';从';const BinNode*';(aka';const struct_uubnode*';)丢弃限定符
我正在研究一个二叉搜索树,并定义了一个结构,如下所示警告:分配给';结构节点*';从';const BinNode*';(aka';const struct_uubnode*';)丢弃限定符,c,C,我正在研究一个二叉搜索树,并定义了一个结构,如下所示 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->d
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;
}
但我遇到了以下警告:
从“const BinNode*”分配给“struct\uu bnode*”(也称为“const
结构_bnode*')丢弃限定符
我认为这还不足以发出警告,但这是因为我错过了一些东西
我缺少什么?您的代码尝试隐式地将
常量BinNode*
转换为BinNode*
,丢弃常量。这是不安全的,所以你会得到警告
以下是这些代码如何影响您:
// 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*
,这正是函数原型所说的SetBinNode
所采用的
节点->左->数据=42代码>也可以很好地编译node->left
是一个BinNode*
node->left->data
是成员
(即在我们的示例中是int
)
但这项任务可能会失败node->left
在调用setbinode
后指向zero
。因为zero
是const
,编译器可能会将其放入只读内存中。现在,分配给节点->左->数据
尝试修改常量
变量,触发分段错误
所有这些都是在没有编译器抱怨的情况下发生的。。。除了setbinode
中的一行之外
解决方案是将setbinode
的类型更改为
static void SetBinNode(BinNode *n, const Member *x, BinNode *left, BinNode *right)
i、 e.删除常量
。参数上的const
正在做出无法兑现的承诺。即使函数本身不通过*left
或*right
写入,它仍然通过非常量访问路径使对象可用,这可能会导致以后的问题。显示如何初始化参数和调用函数。请参阅不要使用以\uuuu
开头的名称。这些是为实施而保留的。更好:typedef结构BinNode;结构BinNode{成员数据;BinNode*left,*right;}代码>