0

免責事項:私はCに非常に慣れていません。私はこれに対する答えを見つけようとしましたが、検索に使用する用語が正確にわからないため、私のgoogle-fuは惨めに失敗しました...

現時点では、コードint a = 100;が構造体内の整数も値を変更するという、かなり予期しない問題が発生しています。

デバッガーから、aとs->posの両方が同じ値を指していることがわかります。これが私のコードのサニタイズされたバージョンです。

typedef struct {
    char data[4096];
    int start;
    int end;
} buffer;

typedef struct {
    int * data;
    int length;
} data_format;

buffer * create_buffer() {
    buffer result;
    result.start = -1;
    return &result;
}

data_format * method(buffer * s) {
    data_format result = (data_format) { malloc(100), 0 };
    ... // POINT1
    int a = 100;
    ... // POINT2
}

int main(int argc, char **argv) {
    buffer * s = create_buffer();
    data_format * df = method(s);
}

// POINT1デバッガーから、、でマークされた行のaは-1であることがわかります。で// POINT2、両方as->start現在100です。

int宣言は、まだ何も使用されていないメモリスポットに変数を作成するべきではありませんか?

4

2 に答える 2

4

でアドレスを返すことにより、ローカル変数のスコープに違反していますcreate_buffer

ローカル変数はスタック上に作成され、スタックは各関数呼び出しで再利用されます。のアドレスを返すことにより、Cが関数の期間中のみ使用するために予約したメモリのセクションのアドレスを保存していresultます。終了すると、そのメモリが再利用されます。この場合、あなたが呼び出すとき、それはあなたの変数と整列しています。リターン変数を動的に割り当てる必要がありますcreate_buffercreate_buffermethodsmalloc

コンパイラによっては、ローカル変数のアドレスを返すことについて警告が表示されるはずです。

于 2013-01-21T03:28:47.347 に答える
2

私の無知を許してください、しかしCでは、何かがcreate_buffer可能でさえありますか?スタック上に作成resultし、それへのポインタを返します。実行さresultれた後、破壊されませんか?create_bufferだから今sは「ゴミ」を指しています。たぶん、aibがコメントで言ったように、それが指しているメモリ内のアドレスはたまたまのアドレスですa

代わりに、create_bufferも必要です。そうすればmallocbufferそのポインタを安全に返すことができます。

于 2013-01-21T03:26:54.043 に答える