3

私は、次のプログラムの問題点を突き止めるために何年も費やしてきました。

typedef struct user {
    char host[40];
    int order;
} user;

typedef struct data {
    user userdat;
} data;

int read_user (char *datname, user *userdat) {
    ...

    fscanf (datin, "%s", &userdat->host);
    fscanf (datin, "%d", &userdat->order);

    //1
    printf ("%d\n", userdat->order);

    ...

}

void init_data (data *dat) {
    init_userdat (&dat->userdat);
}

void init_userdat (user *userdat) {
    *userdat->host = "127.0.0.1";
    userdat->order = 0;
}

int user_print (int i, data *dat) {
    //2
    printf ("%d\n", dat->userdat.order);
}

int main(int argc, char *argv[]) {

    ...
    data dat;
    init_data (&dat);
    read_user (datname, &dat->userdat);
    user_print (&dat);
}

プログラムは、関連するセクションを強調するために非常に単純化されています。何が起こるかというと、最初の print ステートメント (//1) は値を正しく出力しますが、2 番目 (//2) はそうではなく、可能なメモリ位置のように見えるものを出力します。

保存された変数にアクセスするためのさまざまな組み合わせを試しましたが、クラックできません。どんな助けでも大歓迎です。

Edit1: コード内のいくつかの重要でないエラーを修正しました (ポインターまたは構造体に関連していません)。

最終編集: ご協力いただきありがとうございます。Arun Saha が指摘した問題は確かに元のコードにあり、現在は修正されています。ただし、2 つの異なる文字列を出力する問題は解決しませんでした。それ以外の場合はコードがコンパイルされて機能するというあなたの保証により、真の犯人を発見することができました.複雑な構造体の別の部分を適切に初期化していなかったため、user.order変数が上書きされました.

4

2 に答える 2

2

次の行は、それが行うように見えることを行いません:-)

*userdat->host = "127.0.0.1";

userdata->hosthost[40]配列の最初の文字へのポインタです。上記のステートメントは、ソース文字列 ("127.0.0.1") から 1 文字だけをコピーします。文字列全体をコピーするには、標準ライブラリ関数を使用しますstncpy()

strncpy( & userdata->host[ 0 ], "127.0.0.1", 40 );
于 2013-04-07T00:15:48.093 に答える
1

関数でをmain呼び出すread_user (datname, &dat->userdat);と、コンパイルの問題が発生するはずです。これは実際read_user (datname, &dat.userdat);datはポインターではなく、オブジェクト自体であるべきです。

この変更と Arun の以前の推奨により、私はあなたのプログラムを試してみましたが、うまくいきました。

于 2013-04-07T00:32:42.353 に答える