为什么给以下结构体赋值会出现segmentation fault
#include<sys/types.h>/*basicsystemdatatypes*/#include<sys/socket.h>/*basicsocketdefin...
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct my_info
{
int sockfd;
struct sockaddr_in *my_subaddr;//Subnet address;
struct my_info *next;
}node;
int main(int argc, char *argv[])
{
node*s;
unsigned long netaddr;
netaddr = 0x7f000000;
s = (node*) malloc(sizeof(node));
s->my_subaddr->sin_addr.s_addr = netaddr;
return 0;
}
我已经给结构体分配空间了,为什么还出现segmentation fault,s_addr的类型是unsigned long啊,为什么还会越界,求帮助,谢谢。 展开
#include <sys/socket.h> /* basic socket definitions */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct my_info
{
int sockfd;
struct sockaddr_in *my_subaddr;//Subnet address;
struct my_info *next;
}node;
int main(int argc, char *argv[])
{
node*s;
unsigned long netaddr;
netaddr = 0x7f000000;
s = (node*) malloc(sizeof(node));
s->my_subaddr->sin_addr.s_addr = netaddr;
return 0;
}
我已经给结构体分配空间了,为什么还出现segmentation fault,s_addr的类型是unsigned long啊,为什么还会越界,求帮助,谢谢。 展开
展开全部
你只给 node*s 分配了空间。
但node 结构内部 的 my_subaddr 的指针 并未分配空间,也未 让它指向 某一个有存储单元的
struct sockaddr_in 型结构。
所以 接下去 的 sin_addr.s_addr 便没有 存储空间,于是 赋值语句 就垮了, 造成 “段错误”(segmentation fault)。
====
解决办法,s 动态分配后,给 s 内部 的 成员 my_subaddr 动态分配空间,或
声明 一个 struct sockaddr_in si; 结构,把 si 的地址 赋给 s->my_subaddr。
有了存储空间,再做unsigned long 的赋值。
但node 结构内部 的 my_subaddr 的指针 并未分配空间,也未 让它指向 某一个有存储单元的
struct sockaddr_in 型结构。
所以 接下去 的 sin_addr.s_addr 便没有 存储空间,于是 赋值语句 就垮了, 造成 “段错误”(segmentation fault)。
====
解决办法,s 动态分配后,给 s 内部 的 成员 my_subaddr 动态分配空间,或
声明 一个 struct sockaddr_in si; 结构,把 si 的地址 赋给 s->my_subaddr。
有了存储空间,再做unsigned long 的赋值。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询