2

libpq を使用して、postgreSQL クライアント アプリケーションに取り組んでいます。gcc はエラーなしでコンパイルします。ただし、プログラムを実行すると、この関数は次のようになります。

void print_column(PGconn *connection) {

    PGresult *id_list;
    int row;

    // process_query() calls PQexec(), checks for errors, then returns the result
    id_list = process_query(connection, "SELECT id FROM customers WHERE state='CA'");

    for(row = 0; row < PQntuples(id_list); row++) {
        printf("%s\n", PQgetvalue(id_list, row, 0));

        // to pause the loop on each rep for debugging
        getchar();
    }
}

次のエラーが発生します。

row number 1701734765 is out of range 0..8
Segmentation fault

奇妙なのは、for ループが最初の 5 回の繰り返しを問題なく実行していることです。次に、6 番目にセグメンテーション違反が発生します。

1000 行以上あるため、プログラム全体を投稿しませんでした。どんな提案でも大歓迎です。

4

1 に答える 1

3

これによりセグメンテーション違反は発生しませんが、投稿したコードにエラーがあります。

printf("%i\n", PQgetvalue(id_list, row, 0));

このPQgetvalue関数は を返しますがchar *、それを であるかのように出力していますint。GCCとClangの両方に、型の不一致について不平を言う警告があります.-Wall -Wextra少なくとも-Wall. を使用して、フォーマットの不一致の警告だけをオンにすることができます-Wformat。(このエラーによってセグメンテーション違反が発生することはほとんどありませんが、正しくない出力が発生します。)

しかしPQgetvalue、セグメンテーション違反を引き起こすべきではありません (あなたは を呼び出していませんPQclearよね?)。プログラムのどこかにエラーがあり、メモリが破損している可能性があります。Valgrind などのツールを使用して、このようなエラーの検出を試みることができます。1000 行はそれほど長くないので、このような問題は扱いにくいです。どうしても必要な場合は、エラーが止まるまで、さまざまなセクションを#ifdef 0...でコメントアウトすることもできます。#endif

于 2012-04-28T00:10:18.043 に答える