-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_apple
return new_apple;
最後に失敗します。これはnew_apple
、関数が戻るときに戻り値が期待されるレジスタにたまたま横になっている場合に偶然に機能する可能性があります(i386ではこれは通常ですEAX
)が、制御がvoid
戻ってこない関数の終わりに到達できるようにすると、未定義の動作が発生します(これには、予期したとおりに誤って動作することから、悪魔が鼻から飛び出すことまで、あらゆるものが含まれる可能性があります)。
gcc -Wall
(すべての警告を有効にして)コンパイルすると、問題が指摘されると確信しています。return-type
特定の警告です。
return
最後の式はの値に評価されるため、この関数は、存在しない場合に評価された最後の式の値を返すという古い規則を使用するコンパイラーでも機能しませんcolor
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加