如何memset指针指针

时间:2013-12-25 04:23:59

标签: c

我一直试图打印出抗议结构的价值。

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指针到指针变量memsetproto = { 0 }

那我怎样才能忘记p_aliases并打印proto.p_aliases = (null)

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

2 个答案:

答案 0 :(得分:2)

以下memset声明是将proto分配给0的所有内存设置为proto.p_aliases。因此0x000000指向memset(&proto,0,sizeof(proto)); ,然后您需要取消引用它,这会导致细分错误。

*proto.p_aliases

proto.p_aliasesNULL指向的地址内容,因此您无法打印,因为地址为printf("proto.p_aliases = %s\n", proto.p_aliases); // Not *proto.p_aliases 。您只能打印指向的地址。所以你必须将你的打印声明更改为:

%s

由于您正在使用(null)格式化,因此会打印memset

如果您要将*proto.p_aliasesproto.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); 。在这种情况下,您可以打印。然后是它的内容。

{{1}}

答案 1 :(得分:2)

您正尝试取消引用空指针(即成员char **p_aliases)。

附上一个print_array函数,它可以安全地打印您的字符串数组,无论它们是否已被分配或新近归零,如您的示例所示。该数组符合protoent的规范(即终止列表的空条目)。

#include <stdio.h>
#include <string.h>

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

// print char *array[], final entry (s[n]==null), handles empty list (s==null) also
void print_array(char **s) {
    printf("[ ");
    for (int i = 0; s && s[i]; ++i)
        printf("\"%s\" ", s[i]);
    printf("]\n");
}

int main(){
        struct protoent proto  ;
        memset(&proto,0,sizeof(proto));

        printf("With freshly zeroed struct:\n");
        printf("proto.p_name = %s\n",proto.p_name);
        printf("proto.p_aliases = ");
        print_array(proto.p_aliases);
        printf("proto.p_proto = %d\n",proto.p_proto);

        char *aliases[] = { "A1", "A2", 0 };
        proto.p_aliases = aliases;
        printf("\nAfter assigning array:\n");
        printf("proto.p_aliases = ");
        print_array(proto.p_aliases);
}

输出:

$ ./nullstr 
With freshly zeroed struct:
proto.p_name = (null)
proto.p_aliases = [ ]
proto.p_proto = 0

After assigning array:
proto.p_aliases = [ "A1" "A2" ]

我希望这有用。