gpt4 book ai didi

c - 如何 memset 指针到指针

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:10 26 4
gpt4 key购买 nike

我一直在尝试打印 protent 结构的值。

struct protoent {
char *p_name; /* official protocol name */
char **p_aliases; /* alias list */
int p_proto; /* protocol number */
}

我的代码,在 List.c 之后,显示 proto.p_name = (null) 但它在尝试打印 p_alliases 时结束段错误。

谁能告诉我这是怎么发生的?

我认为内存没有分配给p_alliases pointer-to-pointer variable with memset or proto = { 0 }

那我如何 memset 到 p_aliases 并打印 proto.p_aliases = (null)

列表.c

#include <stdio.h>
#include <string.h>
#include <netdb.h>
int
main(){
struct protoent proto ;
memset(&proto,0,sizeof(proto));
printf("proto.p_name = %s\n",proto.p_name);
printf("proto.p_aliases = %s\n",*proto.p_aliases);
printf("proto.p_proto = %d\n",proto.p_proto);
}

最佳答案

下面的memset 语句将proto 分配的所有内存设置为0。所以 proto.p_aliases 指向 0x000000 然后你试图取消引用它导致段错误。

memset(&proto,0,sizeof(proto));

*proto.p_aliasesproto.p_aliases 指向的地址的内容,所以不能打印,因为地址是NULL .您只能打印指向的地址。因此,您必须将打印语句更改为:

printf("proto.p_aliases = %s\n", proto.p_aliases); // Not *proto.p_aliases

因为您使用的是 %s 格式,所以它会打印 (null)

如果你想使用 memset*proto.p_aliases 那么你必须为它分配内存然后 proto.p_aliases 不再指向 NULL。在这种情况下,您可以打印。然后是地址的内容。

    proto.p_aliases = malloc(sizeof(char *));
memset(&(*proto.p_aliases), 0, sizeof(*proto.p_aliases));
printf("*proto.p_aliases %s", *proto.p_aliases);

关于c - 如何 memset 指针到指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20769028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com