#include <stdlib.h>
struct foo{
int a;
};
int main(int argc, char * * argv){
struct foo * bar = malloc(sizeof(struct foo));
free(bar);
return EXIT_SUCCESS;
}
これは、標準に従って未定義の動作を引き起こしませんか?もしそうなら、私は代わりに標準を遵守するために何をすべきですか?
malloc
失敗してbar
割り当てられるとどうなるかという質問の場合、NULL
答えは次のとおりfree
です。が呼び出されても何も起こりません。free
関数は、渡されたポインタがであるかどうかをチェックしますNULL
。ポインタがNULL
ない場合、アクションは実行されません。したがって、ここにはUBはありません。
一般的な注意として:タイプの代わりに実際のオブジェクトを使用すると、より安全になります(または少なくともエラーが発生しにくくなります)。
struct foo * bar = malloc(sizeof(*bar));
#編集#
OPのコメントは質問を明確にします。C標準では、オブジェクトタイプ(関数ポインターではない)へのポインターを任意のタイプのポインターに変換void *
および変換できることが保証されているため、実装内のポインターのサイズは重要ではありませんvoid *
。それが実際にどのように行われるかは、実装に任されています。したがって、C規格で保証されているため、100%安全です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加