1

コードとその結果を検討してください。

while ((row = mysql_fetch_row (table_info)) != NULL)
{
    answer='\0';
    printf ( "%s: ", row[0] );
    scanf ( "%c", &answer );
    getchar();
    if ( answer == 'y')
    {
        printf ( "*****\n" );
        table_name[index] = malloc ( strlen(row[0]) + 1 );
        printf ( "*****\n" );
        memcpy ( &table_name[index], &row[0], strlen(row[0]) + 1 );
    }
    printf ( "finally inserted: %s \n", table_name[index]);
}

実行結果:

1_time_access: y
*****
*****
finally inserted: 1_time_access 
2_time_access: y
*****
*****
finally inserted: 2_time_access 
39_time_access: y
*****
*****
finally inserted: 39_time_access 

結果の説明:row[0]1_time_access2_time_access、があり39_time_accessます。ここで、フォーマット文字列を使用してエスケープするより良い方法を検討してください\n。次のコードを実行すると、セグメンテーション違反が発生します。理由がわかりません。コード:

while ((row = mysql_fetch_row (table_info)) != NULL)
{
    answer='\0';
    printf ( "%s: ", row[0] );
    scanf ( "%[^\n]%*c", &answer );
    if ( answer == 'y')
    {
        printf ( "*****\n" );
        fflush(stdout);
        table_name[index] = malloc ( strlen(row[0]) + 1 );
        printf ( "*****\n" );
        fflush(stdout);
        memcpy ( &table_name[index], &row[0], strlen(row[0]) + 1 );
    }
    printf ( "finally inserted: %s \n", table_name[index]);
    fflush(stdout);
}

結果:

1_time_access: y
*****
./set-env.sh: line 17: 15263 Segmentation fault      (core dumped) ./exec dataset_one

(心配しないでくださいset-env.sh。プログラムを実行するスクリプトです。)

なぜこれが起こっているのか理解できません。

4

1 に答える 1

4
if ( answer == 'y')
{
    printf ( "*****\n" );
    fflush(stdout);
    table_name[index] = malloc ( strlen(row[0]) + 1 );
    printf ( "*****\n" );
    fflush(stdout);
    memcpy ( &table_name[index], &row[0], strlen(row[0]) + 1 );
}

                                    /*     BAD      */
printf ( "finally inserted: %s \n", table_name[index]);

table_name[index]の場合にのみ割り当てanswer == 'y'ますが、関係なくに送信しますprintf。これがセグメンテーション違反が発生する行であると想定しています。

ここでは、デバッガーがあなたの味方です。変数の状態が表示されます。

于 2012-06-20T03:10:58.267 に答える