我在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访问这样的值的正确方法是什么?
答案 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 *数组,或者数组的第一个元素实际上是乱码。