なぜこれはエラーなしでコンパイルされるのですか?そして、なぜそれは32ビットマシンで実行されるのに64では実行されないのですか?

grasingerm

-Wextra -gフラグを使用してgccでこれをコンパイルできますが、エラーは発生しません。void以外の関数から何も返さないことをコンパイラがキャッチしないのはなぜですか?また、これを32ビットと64ビットのマシンで実行しました。32ビットで完全に正常に動作し、「Appleステム長10.Appleカラーr」も印刷されました。ただし、64ビットマシンではセグメンテーション違反が発生します。ここでgccは何をしているので、このような予測できない動作が発生しますか。また、コンパイル時にエラーが発生しないのはなぜですか。

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

struct apple
{
    int stem_length;
    char color;
};

struct apple* alloc_apple(const int stem_length, const char color)
{
    struct apple* new_apple = (struct apple*)malloc(sizeof(struct apple));
    new_apple->stem_length = stem_length;
    new_apple->color = color;
}

int main(int argc, char* argv[])
{
    struct apple* some_apple = alloc_apple(10, 'r');
    printf("Apple stem length %d. Apple color %c\n", some_apple->stem_length,
        some_apple->color);

    free(some_apple);
    return 0;
}
ジェフリー・ハンティン

alloc_applereturn new_apple;最後に失敗しますこれはnew_apple、関数が戻るときに戻り値が期待されるレジスタにたまたま横になっている場合に偶然に機能する可能性があります(i386ではこれは通常ですEAX)が、制御がvoid戻ってこない関数の終わりに到達できるようにすると、未定義の動作が発生します(これには、予期したとおりに誤って動作することから、悪魔が鼻から飛び出すことまで、あらゆるものが含まれる可能性があります)。

gcc -Wall(すべての警告を有効にして)コンパイルすると、問題が指摘されると確信していますreturn-type特定の警告です。

return最後の式はの値に評価されるため、この関数は、存在しない場合に評価された最後の式の値を返すという古い規則を使用するコンパイラーでも機能しませんcolor

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ