2012-04-27 13 views
2

私はlibpqを使ってpostgreSQLクライアントアプリケーションを開発しています。 gccはエラーなくコンパイルします。私は、しかし、この機能のプログラムを実行すると:postgreSQLクライアント(libpq)のセグメント化エラー

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以上の行があるからです。どんな提案も高く評価されます。

答えて

3

これはセグメンテーション違反の原因にはなりませんが、送信したコードにエラーがあります。

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

PQgetvalue機能はchar *を返しますが、それはintであるかのようにあなたはそれを印刷しています。 GCCとClangの両方が型の不一致について不平を言う警告を持っている、私は-Wall -Wextraまたは少なくとも-Wallを提案する。 -Wformatを使用してフォーマットの不一致に関する警告をにすることができます。

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

+0

%iはプログラム内の%sです。私は書式設定に問題があり、投稿する前にその部分を書き直しました。私はあなたのデバッグの提案を試して、私のコードを再チェックします。私はあなたの投稿を続けます。 – contrapositive

関連する問題