0

サイズ 1 の無効な読み取りの valgrind エラーが発生し続け、その理由を特定できません。

エラーの原因は何ですか?

==24647== Invalid read of size 1
==24647==    at 0x40258EA: strcpy (mc_replace_strmem.c:437)
==24647==    by 0x8048606: main (source.c:26)
==24647==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==24647==
==24647==
==24647== Process terminating with default action of signal 11 (SIGSEGV)
==24647==  Access not within mapped region at address 0x0
==24647==    at 0x40258EA: strcpy (mc_replace_strmem.c:437)
==24647==    by 0x8048606: main (source.c:26)
==24647==  If you believe this happened as a result of a stack
==24647==  overflow in your program's main thread (unlikely but
==24647==  possible), you can try to increase the size of the
==24647==  main thread stack using the --main-stacksize= flag.
==24647==  The main thread stack size used in this run was 16777216.

以下は私のコードで、エラーが検出された行にコメントしました (source.c:26)。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>

int main()
{

    char input[100];

    char name[100];

    char age[100];

    int agee[100];

    fgets(input,sizeof(input),stdin); //i scan in the string and store int char array called input.

    char *charpoint;//declare pointer character

    charpoint=strtok(input,"\"");//run strtoken with quotation marks as second part of argument.

    strcpy(name,charpoint);

    char * charpoint2=strtok(NULL,"\",");

    strcpy(age,charpoint2); //This line is where the error occurs. line 26

    sscanf(age,"%d",&agee[0]);

    printf("%s %d",name, agee[0]);

    system("pause");

    return 0;

}
4

2 に答える 2

7

マニュアルページから(強調鉱山):

strtok() および strtok_r() 関数は、トークン自体を NUL 文字に置き換えた後、文字列内の後続の各トークンの先頭へのポインターを返します。 残りのトークンがなくなると、null ポインターが返されます。

あなたのエラーから

==24647==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

したがって、ポインターcharpoint2は NULL です。これは、以前のstrtok呼び出しで期待したものが見つからなかったことを意味します。その可能性を確認し、入力の形式に関するエラーを出力する必要があります。strtokもちろん、呼び出しが意図したとおりに行われることを確認する必要があります。

于 2012-11-13T03:43:23.977 に答える
0

あなたのプログラムに関するいくつかのこと。

  1. 使用する前にすべての配列をクリアします。これにより、ガベージが読み込まれないことが保証されます。これを行うには、memset または単に char input[100] = {0}; を使用します。
  2. データを読み取った後、input[99] = '\0' を明示的に設定して、入力が null で終了していることを確認します。これは、入力が配列のサイズを超えないようにするためです。
  3. strtok によって返されたポインターに対して null チェックを実行します。期待どおりの結果が得られるという保証はありません。null を適切に処理します。私の推測では、 charpoint2 が null として返されるため、エラーが発生します。
于 2012-11-13T03:45:37.340 に答える