Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
警告:分配给';结构节点*';从';const BinNode*';(aka';const struct_uubnode*';)丢弃限定符_C - Fatal编程技术网

警告:分配给';结构节点*';从';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;}