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

时间:2010-10-15 14:58:15

标签: c

我在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 个答案:

答案 0 :(得分:4)

h_addr_list[0]不是字符串,它是pj_in_addr,它是一个32位整数,不会以空值终止。

printf() %d%x,而非%s

有关使用示例,请参阅PJLIB Reference: Network Address Resolution

答案 1 :(得分:1)

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

答案 2 :(得分:1)

仅仅因为它被声明为char** NOT 意味着它是一个字符串数组。

它可能是指向未知格式的字节缓冲区的指针。 (即,jibberish)

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

答案 3 :(得分:0)

结构只包含一个指针。您需要为该指针分配一些存储空间,然后才能使用 。实际上,指针几乎肯定只包含一个(或多或少)随机值。当您在调用strcpy时将其用作目标时,您将覆盖该随机存储位置 - 这可能会导致其他地方出现重大问题。

h_addr_list几乎是一样的 - 它只是一个指向指针的指针。那个(通常)用于引用一个字符串数组,但必须先分配该字符串数组才能将其用于任何有意义的用途。鉴于与hostent结构的相似性,以及这种结构,可能有一些模拟(或包装)gethostbyname和/或gethostbyaddress初始化它。在包装器的情况下(我判断两者中的可能性更大),它可能在hostent中获取正确的数据,然后将数据从hostent复制到此结构。 / p>

答案 4 :(得分:0)

一个有效的简短示例。请记住,为结构分配不会为指针分配。

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

答案 5 :(得分:0)

如果您从未为这些指针初始化/分配内存,则会出现乱码和/或分段错误,因为它们指向内存中的随机点。

答案 6 :(得分:-1)

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

答案 7 :(得分:-4)

使用点运算符

访问struct元素
strcpy(test1, he.h_addr_list[0]);

使用 - &gt;访问“指向”的结构元素操作

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

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