代码之家  ›  专栏  ›  技术社区  ›  MusiGenesis

如何在C中访问此结构的成员?

c
  •  1
  • MusiGenesis  · 技术社区  · 16 年前

    我在C:

    /** This structure describes an Internet host address. */
    typedef struct pj_hostent
    {
        char    *h_name;        /**< The official name of the host. */
        char   **h_aliases;     /**< Aliases list. */
        int      h_addrtype;    /**< Host address type. */
        int      h_length;      /**< Length of address. */
        char   **h_addr_list;   /**< List of addresses. */
    } pj_hostent;
    

    我可以进入 h_name

    strcpy(test1, he->h_name); // copy part of struct into char[] array
    

    它包含一个有意义的“sip2”值。但是,当我试图访问 h_addr_list

    strcpy(test1, he->h_addr_list[0]);
    

    我变得毫无意义。

    在C中访问这样的值的正确方法是什么?

    8 回复  |  直到 16 年前
        1
  •  1
  •   Martin Broadhurst    16 年前

    您正在正确访问它。那个领域真的有胡言乱语。

        2
  •  4
  •   mouviciel    16 年前

    h_addr_list[0] 不是字符串,而是 pj_in_addr ,这是一个32位整数,不以空结尾。

    printf() 它与 %d %x ,不是 %s .

    见 PJLIB Reference: Network Address Resolution 作为使用的例子。

        3
  •  1
  •   abelenky    16 年前

    只是因为它被宣布为 char** 做 不是 意思是它是一个字符串数组。

    它可能是指向未知格式字节缓冲区的指针。(即吉伯里希)

    您应该检查任何可用的文档或其他源代码,以了解h_addr_list究竟是什么以及应该如何解释它的详细信息。

        4
  •  0
  •   Jerry Coffin    16 年前

    结构只包含一个指针。您需要为指向该点的指针分配一些存储空间 在 在你使用它之前。实际上,指针几乎肯定只包含一个(或多或少)随机值。当你把它作为目标的时候 strcpy ,您正在覆盖该随机内存位置—这可能会导致其他地方出现重大问题。

    h_addr_list 基本上是一样的——它只是一个指向指针的指针。它(通常)将用于引用字符串数组,但必须先分配该字符串数组,然后才能将其用于任何有意义的用途。考虑到 hostent 结构,与此结构一起,可能有一些类似于(或包装器) gethostbyname 和/或 gethostbyaddress 初始化这个。在包装器的情况下(我认为两者中可能性较大),它可能在 招待员 ,然后从 招待员 到这个结构。

        5
  •  0
  •   rerun    16 年前

    一个很好的例子。请记住,为结构分配不是为指针分配。

    typedef struct pj_hostent
    {
        char    *h_name;        /**< The official name of the host. */
        char   **h_aliases;     /**< Aliases list. */
        int      h_addrtype;    /**< Host address type. */
        int      h_length;      /**< Length of address. */
        char   **h_addr_list;   /**< List of addresses. */
    } pj_hostent;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        char* s[]= {"this","is","couple of words"};
        pj_hostent hst = {"high",s,3,4,s };
        char  buff[255] = {};
        //Access as a local initialized struct
        strcpy(buff,hst.h_addr_list[0]);
        printf("%s\n",buff);
        pj_hostent * he = & hst; 
        //Access as a pointer 
        strcpy(buff,he->h_addr_list[0]);
        printf("%s\n",buff);
        gets(buff);
    }
    
        6
  •  0
  •   JRam930    16 年前

        7
  •  -1
  •   Alan Haggai Alavi    16 年前

    strcpy 假设您已经为字符指针分配了内存。所以,可能指针仍然有 NULL 价值。

        8
  •  -4
  •   mepcotterell    16 年前

    结构元素通过点运算符访问

    strcpy(test1, he.h_addr_list[0]);
    

    strcpy(test1, he->h_addr_list->[0]);
    

    如果你有点胡言乱语,那么test1不够大,h_addr_list没有指向char*数组,或者数组的第一个元素实际上是胡言乱语。