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

时间:2016-06-19 12:40:49

标签: c pointers struct dereference

初学者问题:我认为我有点理解指针(int * p,x = 1,p =& x)但是当" - >"显然涉及结构。

<form method="post" action="#" dir="rtl">
  <textarea name="question" placeholder="پرسیار"></textarea>
  <input type="text" name="firstChoice" placeholder="وه‌ڵامی یه‌كه‌م"/>
  <input type="text" name="secondChoice" placeholder="وه‌ڵامی دووه‌م"/>
  <input type="text" name="thirdChoice" placeholder="وه‌ڵامی سێیه‌م"/>
  <input type="text" name="fourthChoice" placeholder="وه‌ڵامی چواره‌م"/>
  <input type="submit" name="submitQuestion" value="داخڵبكه‌" style="width:52.4%;cursor:pointer;"/>
</form>

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]);

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

2 个答案:

答案 0 :(得分:0)

更改
root->children[1] = &root->children[1];

root->children[1] = root->children[1];

它不起作用的原因完全如错误消息中所述 -

root->children[i]的类型为node *,这意味着root-&gt; children [i]本身就是一个指向struct node类型数据的内存地址。

话虽如此,你为什么要存储内存地址? 请考虑以下示例:您是一个指向int类型的指针:
int *ptr
现在,如果你想要ptr的内存地址,你可以只printf("%p", ptr)
如果你想要数据,只需printf("%d", *ptr)

答案 1 :(得分:0)

根据您对Ishay的答案的评论,您希望实现 content == address ...

很容易获得,但我想警告你为什么不应该这样做。如果node->children[1]指向其自己的地址,则取消引用指针是未定义的行为,因为其中存在 a node而是node *。这意味着,一旦你拥有了它,任何对*(node->children[1])的读取或写入,甚至使用node->children[1]->...语法的访问都是严格别名规则的明确未定义行为(搜索 C的SO)严格的别名规则了解更多详情。

一旦你被警告过,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]。换句话说,您可以将指向一种类型的指针转​​换为指向另一种类型的指针,然后将其强制转换为您提供初始值,但不得拒绝不正确的指针。