gpt4 book ai didi

C:错误:不兼容的指针类型,删除&-存储其自身地址的指针

转载 作者:行者123 更新时间:2023-11-30 19:38:35 25 4
gpt4 key购买 nike

初学者问题:我想我对指针(int *p,x = 1,p = &x)有所了解,但显然涉及“->”和结构时则不然。

typedef struct node
{
bool is_word;

struct node* children[27];
}
node;

node* root = calloc(1, sizeof(node));

printf("address:%p\n", &root->children[1]);
printf("content%p\n", root->children[1]);

printf("\n");
root->children[1] = &root->children[1];

printf("address:%p\n", &root->children[1]);
printf("content%p\n", root->children[1]);

简单来说,我有一个指针,我希望它存储自己的地址。但它给了我:

error: incompatible pointer types assigning to 'struct node *'
from 'struct node **'; remove & [-Werror,-Wincompatible-pointer-types]
root->children[1] = &root->children[1];
^ ~~~~~~~~~~~~~~~~~~

我尝试了一些组合,但到目前为止还没有成功。我错过了什么?

最佳答案

根据您对 Ishay 答案的评论,您希望实现内容==地址...

这很容易获得,但我想警告您为什么不应该这样做。如果 node->children[1] 指向它自己的地址,则取消引用该指针是未定义的行为,因为那里不是一个节点 而是一个节点*。这意味着一旦您拥有了该权限,就可以对 *(node->children[1]) 进行读取或写入,甚至使用 node->children[1]-> ... 语法,根据严格别名规则明确是未定义行为(在 SO 中搜索 C 严格别名规则 以获取更多详细信息)。

一旦你被警告,C语言对程序员非常有信心,甚至允许你做一些无意义的事情:

root->children[1] = (void *) &root->children[1]; /* or root->children[1] = (node *) &root->children[1]; */

printf("address:%p\n", &root->children[1]);
printf("content%p\n", root->children[1]);

将显示您想要的内容。这是因为总是允许将指针复制到 (void *),同样,void * 也可以复制到任何其他指针。 C 标准要求(假设不存在对齐问题,并且在您的示例中不应该存在)这些指针分配已完美定义,并且:

node ** p = (node **) root->children[1];

也已定义,并且 p 必须指向 root->children[1]。换句话说,您可以将指向一种类型的指针转​​换为指向另一种类型的指针,并将其转换回来将为您提供初始值,但您不得取消引用不正确的指针。

关于C:错误:不兼容的指针类型,删除&-存储其自身地址的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37907328/

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