我有一个基本的问题,我不能为我的生活弄清楚。新来的C所以请耐心等待。
首先,我创建一个结构数组:
struct rule {
int *in; /* ingress flag */
int *out; /* egress flag */
char *actionvalue; /* actionvalue BLOCK or UNBLOCK */
char *proto; /* protocol e.g. UDP TCP ICMP */
char *ip_src; /* source and dest address */
int *srcport; /* src port */
char *net_src; /* source and dest netmask */
char *ip_dst; /* source and dest address */
int *dstport; /* dst port */
char *net_dst; /* source and dest netmask */
} rulelist[10];
然后我为他们分配值
rulelist[policy_count].in = strsep(&temp, delims);
rulelist[policy_count].out = strsep(&temp, delims); etc...
然后我可以毫无问题地访问它们
printk("%s", rulelist[policy_count].in);
然而,当我去另一个函数的代码中访问数组时,该数组......
printk("%s", rulelist[policy_count].in);
会崩溃,就像它取消呈现空指针一样。
我已经阅读了很多关于初始化而非分配的内容,但每个示例都不同,我似乎无法很好地掌握它。
我也不明白如何立即访问它,然后无法使用其他功能。结构是全局声明的,所以我不相信它的范围问题。
由于
答案 0 :(得分:5)
函数strsep
返回temp
中的指针。 temp
失效后(例如,当其范围结束时)rulelist[policy_count].in
将指向无效的内存。
所以你应该malloc
一些内存并复制数据。但是,由于您使用的是strsep
,因此您很可能已经拥有strdup
:
char *p = strsep(&temp, delims);
rulelist[policy_count].in = strdup(p);
答案 1 :(得分:0)
将结构定义为:
struct rule {
int in; /* ingress flag */
int out; /* egress flag */
char *actionvalue; /* actionvalue BLOCK or UNBLOCK */
char *proto; /* protocol e.g. UDP TCP ICMP */
char *ip_src; /* source and dest address */
int srcport; /* src port */
char *net_src; /* source and dest netmask */
char *ip_dst; /* source and dest address */
int dstport; /* dst port */
char *net_dst; /* source and dest netmask */
} rulelist[10];
并通过以下方式为其指定值:
rulelist[policy_count].in = atoi(strsep(&temp, delims));
rulelist[policy_count].out = atoi(strsep(&temp, delims));
rulelist[policy_count].actionvalue = strdup(strsep(&temp, delims));
rulelist[policy_count].proto= strdup(strsep(&temp, delims));
...
然后你可以通过以下方式打印int字段:
printf("%d", rulelist[policy_count].in);
字符串字段:
printf("%s", rulelist[policy_count].actionvalue);
为避免内存泄漏,请不要忘记通过free()释放字符串字段。