1

次のコードから取得しているセグメンテーション違反を理解できません。

#include <stdio.h> 
#include <jpeglib.h>
#include <stdlib.h>

int main(int argc, char** argv){
    FILE*                   outfile;
    JSAMPLE*                row_pointer;
    struct jpeg_error_mgr   jerr;
    long long int           *w, *h;

    setSomePointers(w, h);

    printf( "%lld  %lld\n", *w, *h);
}

最初の 3 つの宣言のいずれかをコメントアウトすると、修正されます...

奇妙なことに、次のコードが機能します。

#include <stdio.h> 
#include <jpeglib.h>
#include <stdlib.h>

int main(int argc, char** argv){
    FILE*                   outfile;
    JSAMPLE*                row_pointer;
    struct jpeg_error_mgr   jerr;
    long long int           w, h;

    setSomePointers(&w, &h);

    printf( "%lld  %lld\n", w, h);
}

何かおかしなことが起こっているのでしょうか、それとも C のチュートリアルを実行する必要がありますか?

4

1 に答える 1

4

これはまったく定義されていない動作です。初期化されていないポインターを逆参照します。

実際の問題は

printf( "%lld  %lld\n", *w, *h);

他のものは単なる宣言です。と はまったく初期化されていないため、逆参照wしないでください。hこれは、最初の (3) 行のコメント化/コメント解除とは関係ありません。

于 2011-04-29T13:44:46.930 に答える