C - 访问结构数组

时间:2012-02-12 17:23:09

标签: c arrays pointers struct

我有一个基本的问题,我不能为我的生活弄清楚。新来的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);

会崩溃,就像它取消呈现空指针一样。

我已经阅读了很多关于初始化而非分配的内容,但每个示例都不同,我似乎无法很好地掌握它。

我也不明白如何立即访问它,然后无法使用其他功能。结构是全局声明的,所以我不相信它的范围问题。

由于

2 个答案:

答案 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()释放字符串字段。