この動作はどこに文書化されていますか (文書化されている場合)?
C でブロックの途中でポインタを宣言すると、おそらく間違った状態 (使用できないメモリを指している) になり、標準if (a) free(a)
を使用して解放することはできません。
頭に浮かぶ最も簡単なプログラムは
#include <stdlib.h>
int main(int argc, char *argv[]){
if(argc > 1) goto END;
char *a = NULL;
a = calloc(1,1);
END:
if(a) free(a);
}
パラメーターなしでプログラムを実行すると、問題なく動作します。少なくとも 1 つのパラメーターを指定して実行すると、おそらく次のように壊れます: 驚くべきことに (私には)、clang でコンパイルすると動作する可能性があります (私の OS X では動作します)。 、しかし NetBSD ではそうではありません)。gcc を使用すると、常に
malloc: *** error for object 0x7fff5fc01052: pointer being freed was not allocated
ブロックの先頭に宣言がある同じプログラムが正しいことに注意してください。
編集: 質問はドキュメンテーションに関するものであることに注意してください。私が説明していることを行うのは安全ではないことは理解していますが、それが明示的に示されている場所は見つかりませんでした。