我一直试图打印出抗议结构的价值。
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
指针到指针变量memset
或proto = { 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);
}
答案 0 :(得分:2)
以下memset
声明是将proto
分配给0
的所有内存设置为proto.p_aliases
。因此0x000000
指向memset(&proto,0,sizeof(proto));
,然后您需要取消引用它,这会导致细分错误。
*proto.p_aliases
proto.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);
。在这种情况下,您可以打印。然后是它的内容。
{{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" ]
我希望这有用。