2017-07-27 13 views
0

私はcharポインタの配列を使用しています。strlen_sse2()によるセグメンテーションフォールト

#define MAXFIELDS 100 
#define MAX_LENGTH 245 

char *dex_data[MAXFIELDS]; //declared globally. 

このdex_data配列は非常に多くの機能で使用されています。このような主な機能でメモリを割り当てます。

dex_data = malloc(sizeof(char *)*MAXFIELDS); 

int p; 

for(p=0; p < MAXFIELDS ; p++) 
    dex_data[p] = malloc(sizeof(char)*MAX_LENGTH); 

毎回セグメンテーションフォールトを取得します。私はGDBを通してエラーをチェックしようとしました。それは言う

#0 0x00007fb0a91b2b71 in __strlen_sse2() from /lib64/libc.so.6 

私は間違ってメモリを割り当てるか、大きなメモリを割り当てようとしましたか? 私はその理由を知らない。誰でも助けてくれますか?前もって感謝します。

+1

エラーが発生しているコードを表示してください。文字列に ''\ 0'がない場合、何かを割り当てるのを忘れてしまいました(ここでは100個のポインタにスペースを割り当てますが、20個の文字列を割り当てるだけです)、あるいはポインタを上書きしてしまいましたそれはどこかの点をランダムに指しています。 –

+0

これまでに示したメモリ割り当てコードはOKです。これは、ハードコードされた20エントリの 'dex_data'のためだけにポインタを割り当て、' for(p = 0; p lurker

+0

私はこのdex_data []をstrlen()のstrcmp()内の非常に多くの場所で使用しましたが、他に何もしませんでした。とにかくあなたのための1つの例。 if(strlen(dex_data [6])> 0){ free_qty = atoi(dex_data [6]); } else { free_qty = 0; } – Nani

答えて

0

この:

char *dex_data[MAXFIELDS]; 

はすでにスタック上char*ポインタのMAXFIELDS量を持つ配列です。割り当てできません。ただし、ここに:

dex_data = malloc(sizeof(char *)*MAXFIELDS); 

あなたに割り当てようとしています。それは未定義の動作です。

その行を削除するだけです。 dex_dataのメモリを割り当てる必要はありません(また許可されていません)。

サイドノート:配列型に割り当てることは、少なくともコンパイル警告を与えるべきです。非常に古いコンパイラを使用しているようですが、おそらくアップグレードするべきです。

+0

あなたが言った線を削除しましたが、まだセグメント化エラーです。私はgcc(GCC)4.8.5 20150623(Red Hat 4.8.5-11)のパテを使用しています。私は警告を受けなかった。しかし、私は前と同じように、同じエラー "__strlen_sse2()/lib64/libc.so.6"を得ました。 – Nani

+0

@ Nani次に、何かがセグメンテーションを引き起こしています。違反行を削除した後、投稿したコードは完全に正常です。 –

+0

このdex_dataを除いて、どこでもプログラムは問題ありません。どちらがエラーの原因かわかりません。このdex_dataバッファに大きなメモリを使用していますか? – Nani

関連する問題