【问题标题】:Dereferencing a pointer to a struct to access its first member取消引用指向结构的指针以访问其第一个成员
【发布时间】:2013-09-05 16:41:50
【问题描述】:

出于特定原因,我只想通过取消引用指向结构的指针来访问结构的第一个成员。

我想知道这是否合法或在某些情况下会导致 UB;如果这个有任何问题,什么是正确的解决方案。

谢谢。

#include <stdio.h>
#include <stdlib.h>

typedef struct test_s
{
    void * data ;
    struct test_s * next ;

} test_t ;


int main( void )
{
    test_t * t = calloc( 1 , sizeof( test_t ) ) ;

    int n = 123;

    t->data = &n ; //int is used only for an address, this could be anything, an object for example
    void ** v = ( void* )t ;
    printf("Address of  n: %p\nAddress of *t: %p\n\n" , &n , *v ) ; //dereference the pointer to struct to access its first member

return 0;
}

【问题讨论】:

  • 为什么不直接使用 void **v = &t->data ?
  • @giorashc 对 t 的标识在我的代码中丢失了,我只有一个指向 t 的空指针。以上只是一个例子。

标签: c pointers struct dereference


【解决方案1】:

是的,这是合法的。从 C99,6.7.2.1.13:

一个指向结构对象的指针,经过适当的转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。结构对象中可能有未命名的填充,但不是在其开头。

【讨论】:

    【解决方案2】:

    是的,这是 100% 合法的:C 标准规定指向 struct 的指针必须始终等于指向 struct 的初始成员的指针。

    【讨论】:

    • 如果指向结构ps = &amp;struct 的指针具有该结构struct.member 的第一个成员的地址,那么为什么需要取消引用指针ps 才能访问该第一个成员?因为如果ps 拥有您建议的第一个成员的地址,那么我将通过ps.member 而不是ps-&gt;member 简单地访问该成员?如果ps==&amp;struct.firstmember 这应该是可能的
    • @Herdsman 我没有任何建议,我完全按照标准说明了内容。
    • 这个问题只是为了解释,我知道它是如何工作的,但不要只需要-&gt;在struct中访问first member,当两者(结构指针,第一个成员指针) 具有相同的地址。当地址相同时,为什么我不能简单地做ps.firstmember(带点,不带箭头)
    • @Herdsman Dot . 和箭头 -&gt; 运算符在 C 语言中是完全可以相互转换的:您可以将所有 s.f 的用法替换为 &amp;s-&gt;f,并将所有 p-&gt;f 的用法替换为 @ 987654338@。事实上,大约 33 年前,当我从 K&R 的书中自学 C 语言时,我在第一次阅读时错过了 -&gt; 运算符,并使用点运算符 . 对所有内容进行了编码,即使我不得不取消引用指针。我很幸运有一位导师向我指出了这个问题。
    • 这就是它的使用方法。但是如果我有struct foo { int first;int second; }; ,那么即使struct foo mystruct 的初始化也是指针(或者foo 的值是什么,如果不是地址)?因为我将如何访问second 成员?我需要从第一个偏移 2*4 字节才能到达第二个?然后即使. 也被取消引用,因为通过foo.second 我从开始(第一个成员)取消引用地址以通过偏移量到达第二个成员。还是我错过了什么?
    猜你喜欢
    • 2014-05-09
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2011-11-10
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    相关资源
    最近更新 更多