2017-08-01 2 views
1

私はこのタイプのループのさまざまな順列を試しました。文字を静的配列にコピーするprintf奇妙な出力を生成する

char hrstdesc[50][50]; 
char hrstread[50][50]; 
int i = 0; 

for (hfree = hentry; hfree; hfree = hfree->prev) { 
    if (filterentry(hfree)) { 
     continue; 
    } 

    strcpy(&hrstdesc[i][0], hfree->hrstdesc); 
    printf("%s \n", hrstdesc[i]); 
    i++; 
} 
printf("%s \n", hrstdesc[1]); 

出力され、

/run/media/username/archive 
/home 
/var 
/
/ho/va/ 

最初の4行は、printf("%s \n", srtdesc);、から来て、私が期待するものです。

最後の行は/homeと表示されますが、代わりに/ho/va/と表示されます。あなたがリンクされたファイルで

https://github.com/techzilla/check_snmp_extras/blob/master/src/check_snmp_disks.c

+2

(hentry = hentry;)??? –

+0

'hentry = hentry'なぜあなたはそれをしますか? – babon

+0

@babon、私を修正してください、私はそれを非常に感謝します。私はちょうどあなたがこの構造体をループするときにしなければならなかったものだと思った。私はより良い練習に非常に興味があります。 私は、このようなループを実行するために一時変数を作成する人がいるのを見たことがありますが、その理由はわかりませんでした。 ''(hfree = hentry; hfree; hfree = hfree-> prev){' – TechZilla

答えて

1

、あなたは[MAX_ENTRIES] [MAX_ENTRIES](いない[50] [50])hrstdescとして[] [] hrstdescを定義しています。 MAX_ENTRIESは、同じrepoで使用可能なcheck_snmp_extras.hヘッダーで3として#定義されています。

奇妙な動作は、各ループ反復でhrstdesc [] []のオーバーランが原因です。

最後のhrstdesc [1]は、ループ反復1(/ home)の最初の3文字、ループ反復2(/ var)の最初の3文字、ループ反復3の1文字)。

+0

メモリが壊れているために、セグメンテーションフォルトやコアダンプなどが得られなかったのに驚いています... – lyst

関連する問題