C - Доступ к массиву элементов - PullRequest
0 голосов
/ 12 февраля 2012

У меня есть основная проблема, которую я не могу решить для своей жизни. Новичок в С так терпеть меня.

Сначала я создаю массив структур:

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 ]

5 голосов
/ 12 февраля 2012

Функция strsep возвращает указатель где-то в temp. Как только temp становится недействительным (например, когда заканчивается его область действия), rulelist[policy_count].in будет указывать на недопустимую память.

Так что вам, вероятно, следует malloc немного памяти и скопировать данные. Но так как вы используете strsep, есть большая вероятность, что у вас уже есть strdup:

char *p = strsep(&temp, delims);
rulelist[policy_count].in = strdup(p);
0 голосов
/ 12 февраля 2012

Определить структуру как:

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 ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...