免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bxb_koala
打印 上一主题 下一主题

急问,结构体如何初始化? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-06-08 16:43 |只看该作者
  1. typedef struct config_data {
  2.         char *user_name;
  3.         int user_id;
  4.         char *server_ip;
  5.         int server_port;
  6. } config_data_t;

  7. config_data_t *my_config_data;

  8. my_config_data = (config_data_t*)malloc(sizeof(config_data_t));
  9. bzero(my_config_data, sizeof(my_config_data));
复制代码


这部分代码在编译没有问题,但在运行时出现Segmentation fault
如果把结构体中的char *变量换成char数组运行时就OK啦!
why?

论坛徽章:
0
12 [报告]
发表于 2007-06-08 16:48 |只看该作者
原帖由 bxb_koala 于 2007-6-8 16:43 发表
[code]typedef struct config_data {
        char *user_name;
        int user_id;
        char *server_ip;
        int server_port;
} config_data_t;

config_data_t *my_config_data;

my_conf ...

因为你没有为你的char *分配值,当前char *里面的值所指向的空间可能是系统保护的

[ 本帖最后由 while(1) 于 2007-6-8 16:49 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2007-06-08 17:02 |只看该作者
我用bzero来为char *指向的内容分配值的啊

论坛徽章:
0
14 [报告]
发表于 2007-06-08 17:07 |只看该作者
结构体内的指针,还可以认为是野指针的形式。我认为首先为结构体内的指针初始化,或者指向一块分配的空间地址。。。。。。

论坛徽章:
0
15 [报告]
发表于 2007-06-08 17:22 |只看该作者
  1. typedef struct config_data {
  2.         char *user_name; => char user_name[20];
  3.         int user_id;
  4.         char *server_ip; => char server_ip[20];
  5.         int server_port;
  6. } config_data_t;

  7. config_data_t *my_config_data;

  8. my_config_data = (config_data_t*)malloc(sizeof(config_data_t));
  9. bzero(my_config_data, sizeof(my_config_data));
复制代码


能不能最好不用,省得麻烦.

论坛徽章:
0
16 [报告]
发表于 2007-06-08 17:22 |只看该作者
原帖由 bxb_koala 于 2007-6-8 17:02 发表
我用bzero来为char *指向的内容分配值的啊

在這裡,你用bzero只是把char *指針置為NULL而己。

论坛徽章:
0
17 [报告]
发表于 2007-06-08 17:40 |只看该作者
如果结构体中用char*变量,执行完bzero语句后,打印的变量如下:
(gdb) p my_config_data->user_name
$1 = 0x0

而如果结构体中用char数组变量,执行完bzero语句后,打印的变量如下:
(gdb) p my_config_data->user_name
$2 = '\0'

为何会有这种差别,哪位达人可以解答?

论坛徽章:
0
18 [报告]
发表于 2007-06-08 18:11 |只看该作者
原帖由 bxb_koala 于 2007-6-8 17:40 发表
如果结构体中用char*变量,执行完bzero语句后,打印的变量如下:
(gdb) p my_config_data->user_name
$1 = 0x0

而如果结构体中用char数组变量,执行完bzero语句后,打印的变量如下:
(gdb) p my_config_ ...

數組可以直接往裡面放東西,指針必需先malloc然後才能使用。明白?

论坛徽章:
0
19 [报告]
发表于 2007-06-08 22:00 |只看该作者
typedef struct config_data {
        char *user_name;
        int user_id;
        char *server_ip;
        int server_port;
} config_data_t;

config_data_t *my_config_data;

my_config_data = (config_data_t*)malloc(sizeof(config_data_t));
bzero(my_config_data, sizeof(my_config_data));
可是我已经malloc了呀?

论坛徽章:
0
20 [报告]
发表于 2007-06-09 09:47 |只看该作者
原帖由 bxb_koala 于 2007-6-8 22:00 发表
typedef struct config_data {
        char *user_name;
        int user_id;
        char *server_ip;
        int server_port;
} config_data_t;

config_data_t *my_config_data;

my_config_data = (config_data_t*)malloc(sizeof(config_data_t));
bzero(my_config_data, sizeof(my_config_data));
可是我已经malloc了呀?


user_name 和 server_ip 要先分配内存
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP