3

埋め込み SQL を使用してデータベース テーブルから行をフェッチし、行データを構造体に格納し、そのデータを処理して結果を別の構造体に格納し、リンク リストにプッシュするプログラムで壁にぶつかりました。フェッチデータが格納される構造体は次のとおりです。

struct rowstruct {
    char    *first;
    char    *last;
    long    amt;
}   client;

処理されたデータを格納するために使用する構造体 (およびその後、リンクされたリストにノードとしてプッシュする) は次のようになります。

struct mystruct {
        char    *firstN;
        char    *lastN;
        long    total;
    }   data;

私の問題は、フェッチ ループが発生するたびに、client.first と client.last の値を data.firstN と data.lastN にコピーする必要があることですが、それを機能させることができません。以下は、代入演算子を使用して、値ではなくポインターをコピーしているように見えます。

data.firstN = client.first;
data.lastN = client.last;

ループの最初の繰り返しの後に data.firstN と data.lastN を出力すると、値は正しく表示されますが、2 回目のフェッチの繰り返しの後、リストの最初のノードは最初のフェッチではなく 2 回目のフェッチの値を反映します。

strcpy はコンパイルされますが、セグメンテーション違反が原因で実行時に失敗します。これは、ここで読むことから、使用されている char* が原因ですが、埋め込み SQL を使用してデータをフェッチするときに char[] または文字列を使用できるとは思わないので、それは行き止まりのようです。

これを行う方法があると確信しており、ここにいるほとんどの人にはおそらく明らかですが、途方に暮れています。どんな助けでも大歓迎です。

ありがとう!

4

1 に答える 1

3

コードがポインターをコピーするように指示している場合、まさにそれが起こります。

おそらくあなたが望むのは、

data.firstN = strdup (client.first);
data.lastN = strdup (client.last);

同じことを行う C++ 風の方法は他にもありますが、これで問題は解決するはずです。


構造を再宣言する必要はありません。data代わりに、次のように宣言できます

struct rowstruct data;
于 2012-10-12T18:36:55.747 に答える