2012-02-12 11 views
0

私は私の人生のために私が理解できない基本的な問題があります。 Cを新しくするので、私に同行してください。C - スタティックの配列にアクセス

まず私は、構造体の配列を作成します。私は、それら

rulelist[policy_count].in = strsep(&temp, delims); 
rulelist[policy_count].out = strsep(&temp, delims); etc... 

に値を割り当てる

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

をそして私はその問題

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

せずにアクセスすることができますしかし、私が配列にアクセスするには、あとでコードiそれはNULLポインタをderefrencingされるようにnは別の関数..

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

は、クラッシュします。

私は割り当ての代わりに初期化について多くのことを読んだが、それぞれの例が異なり、私はそれをよく理解できないようだ。

私はすぐにそれにアクセスして別の機能ではできないことも理解できません。構造体はグローバルに宣言されているため、スコープの問題は考えません。

おかげ

+0

すべてのコンパイラ警告を有効にして、例外なくコンパイルしてください(たとえば、-W -Wall -Wextra -pedantic -Wwrite-strings')。警告を無視しないでください。 –

答えて

5

tempでsomehwereポインタを返すstrsep機能。 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

+0

@kevglissまあ、 'strdup'は' malloc'と 'strcpy'を使って実装されています。 – cnicutar

+0

さて、私が思っていた、それはクールだ。 – kevgliss

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

は、無料で自由に文字列フィールドに忘れてはいけません()。

関連する問題