2012-02-12 42 views
0

我有一個基本問題,我不能爲我的生活弄清楚。對C來說新的東西讓我忍受。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);

但是,當我在代碼i中稍後訪問數組時, ñ另一個功能..

printk("%s", rulelist[policy_count].in);

會崩潰,就像是derefrencing一個空指針。

我已經閱讀了很多關於初始化而不是分配的內容,但每個例子都不一樣,我似乎無法很好地理解它。

我也不明白我如何立即訪問它,然後無法在不同的功能。這個結構是全局聲明的,所以我不相信它是一個範圍問題。

由於

+0

請始終且毫無例外地在啓用所有編譯器警告的情況下進行編譯(例如,GCC上的-WWallWatra -pedantic -Wwrite-strings),並且不要忽略任何警告。 – 2012-02-12 17:27:15

回答

5

strseptemp somehwere返回一個指針的函數。一旦temp變得無效(例如,當其範圍結束時)rulelist[policy_count].in將指向無效內存。

所以你應該可能malloc一些內存和複製數據。但是,由於您使用的strsep有一個很好的機會,你已經有了strdup

char *p = strsep(&temp, delims); 
rulelist[policy_count].in = strdup(p); 
+0

太棒了!我知道我在做一些愚蠢的事情。如果我不能使用strdup,那麼簡單地執行strcpy(vmalloc(strlen(p)+ 1),p)會有什麼問題嗎? – kevgliss 2012-02-12 18:05:11

+0

@kevgliss好吧,'strdup'是使用'malloc'和'strcpy'實現的。 – cnicutar 2012-02-12 18:07:27

+0

好吧,很酷,那是我的想法。 – kevgliss 2012-02-12 18:15:03

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); 

爲了避免內存泄漏,不要被免費忘記自由字符串字段()。