2012-12-28 19 views
10

私はvalgrindのに問題を抱えているValgrindは:これは私のプログラム(エラーが表示されるだけでなく、メインの部分)である :サイズの無効読み取り1

int main() 
{ 
char comanda[N]; 
.... 
char *p; 
while(fgets(comanda,100,stdin)!=NULL) 
    { 
    p=strtok(comanda," \n"); 
    if (strcmp(comanda,"INIT")==0) 
     { 
     p=strtok(NULL," "); 
     Init(n);   
     } 
395 >>if (strcmp(p,"DUMP")==0) 
     { 
     Dump(n);} 
    if (strcmp(p,"ALLOC")==0) 
     { 
     Alloc(j,n); 
     } 
    ....return 0;} 

と私はvalgrindの実行時に、それは言います:

Invalid read of size 1 
at 0x401569: main (:395) 
Address 0x0 is not stack'd malloc'd or (recently) free'd 

私はこのプログラムの問題ですかを把握することはできません。

+2

'' strtok'の後に 'p'が' NULL'であることを確認してください。 – DCoder

+0

デバッガの下でプログラムを実行して、何が間違っているのかを判断することもよいでしょう。 –

+2

デバッガはここでは必要ありませんが、valgrindはここで何が起こっているかを正確に示しています。 @ user1934103、あなたに何を伝えているのかをお読みください。それが示している場所では、どのアドレスが '0x0'ですか?したがって、 'p'は' 0'です。 –

答えて

5

トークンがなくなるとstrtokがNULLを返す可能性があります。

strcmpにNULLを渡すと、そこにNULLを参照解除するため、未定義の動作になります。この読み方

22

サイズの不正読み取り1

をあなたのプログラムがValgrindのは好きではないどこかから1つのバイトを読み込むしようとしています。 0x401569で

:メイン:コードで、これは(明らかにstrcmpのインライン化されています)

アドレス0x0は、mallocさstack'dかされていません(395)

起こります(最近)free'd

0x0は "NULL"です。残りの声明ではなぜそれが無効か(スタックからではなく、あなたがmallocから得たものではなく、最近解放されていない)と述べられています。 valgrindは制限された数の解放のために解放されたメモリを追跡しているので、「最近」は言及されているので、それは解放されていないことを確かめることはできません。そのようなメッセージを見て、それは何年も前に解放されたので無効になったかもしれません。アドレスは0 tho '(またはゼロに近い)ではありません。

関連する問題