-3

スコープに問題があり、助けが必要です。

main.c、parser.c、parser.h の 2 つのソース ファイルとヘッダー ファイルがあります。

parser.h で:

struct buffer{
    char member1[30];
    char member2[20];
    char member3[20];
    char member4[20];
}buf;
void parse(char* line);

parser.c で:

void parse(char* line){
    clear_buf(); //I clear my current buffer before running this function
    char temp[30];
// .... some code which copies from my line into my temporary buffer (temp)
// .... some code which decides which of my buffers I want to copy this to
strcpy(buf.member1,temp);
//Check the addresses- the struct buf is the same, the member is not:
//printf("buffer INSIDE function %p\n",&buf.member1);
//printf("STRUCT BUF, INSIDE function %p\n",&buf);
// at THIS point, when checking, buf.member1 does have the correct data copied into it
}

main.c で:

while(fgets(line,100,fp)!=NULL){
    /*parse the line into our internal buffer*/
    parse(line);
    //check addresses in main- buf.member1 is different, but the struct buf is the same
    //printf("STRUCT BUF, in main %p\n",&buf);
    //printf("buffer in main %p\n",&buf.member1);
    //rest of code...
    }

問題は、バッファ内の値が保存されていないことです...なぜですか?

構造体を引数として関数に渡していないため、これは「値による呼び出し」の問題ではないことに注意してください。

4

1 に答える 1

0

あなたが示していないコードのバグのために、値が保持されない可能性が最も高いです...バグのあるコードを見ずに推測するのに十分な千里眼がある人はいないと思います。

そのため、代わりにデバッグのヒントをいくつか用意してください。

  • デバッガーを使用し、コードをステップ実行し、バッファーをウォッチに配置するだけで、値がいつ変更されるかがわかります (保持されていない場合は確実に変更する必要があるため)。

  • デバッガーに問題がある場合は、printf("buf at line %d: %p\n", __LINE__, &buf);すべての関連する場所に対してデバッグ ステートメントを試して、同じ構造体インスタンスで実際に操作していることを確認してください。

  • デバッガーに問題がある場合は、関連するすべての場所に対してデバッグ ステートメントを試しprintf("buf strings at line %d: '%30s' '%20s' '%20s' '%20s'\n", __LINE__, buf.member1, buf.member2, buf.member3, buf.member4);て、値がどのように変化するかを確認します。

  • 文字列が本当に '\0' で終了していることを確認してください。

  • 文字列のコピーを行うときは常に、宛先バッファのオーバーフローを許可しないでください。何らかの方法で発生することを不可能にします (注: を使用する場合は注意してください。strncpy終了する を追加することが保証されていない'\n'ため、strncatまたはのsnprintf方が使いやすい場合があります)。

于 2013-03-09T10:32:38.280 に答える