これの間に本当の違いがあるかどうか知りたいです:
c = (struct_t *) malloc(sizeof(struct_t));
この
c = malloc(sizeof(struct_t *));
キャストを回避することに加えて、コンパイラーは最初の形式を尊重して2番目の形式で何らかの利点を利用していますか?または、2つの方法は完全に同じであり、単なる「美的」な質問ですか?
これの間に本当の違いがあるかどうか知りたいです:
c = (struct_t *) malloc(sizeof(struct_t));
この
c = malloc(sizeof(struct_t *));
キャストを回避することに加えて、コンパイラーは最初の形式を尊重して2番目の形式で何らかの利点を利用していますか?または、2つの方法は完全に同じであり、単なる「美的」な質問ですか?
最初はsizeof(struct_t)
バイトを割り当て、2番目はsizeof(struct_t*)
バイトを割り当てます。
malloc
それを除けば、結果をキャストするかどうかに関係なく、何をするかに違いはありません。結果をキャストすると、コードはC ++コンパイラーに受け入れられますが、インクルードしないという間違いを隠すことができるためstdlib.h
、結果をCでキャストしないことが広く推奨されます。
2つは完全に異なります。1つ目は構造体のインスタンスを割り当て、2つ目は構造体へのポインターを割り当てます。
一般に、同じバイト数を割り当てることすらありません。
いいえ、同じではありません。後者は構造体へのポインタに4バイトまたは8バイトのスペースを割り当て、前者は構造体自体に十分なスペースを割り当てます。
sizeof(struct_t)が十分に小さい場合、およびmallocが実際に要求よりも多くを割り当てる場合、ユーザーには違いが表示されない場合があります。
2つの形式は異なります。どちらもメモリを割り当てますが、量は異なります。一般的なルールは次のとおりです。タイプTを割り当てる場合、mallocの結果はT*にキャストされます。
void sample1()
{
struct pollfd *pfd = (struct pollfd*)malloc(sizeof(struct pollfd));
// pfd is points to a memory with a size of struct pollfd
...
free(pfd);
}
void sample2()
{
struct pollfd *pfd = (struct pollfd*)malloc(sizeof(*pfd));
// same as above, but uses variable type instead
free(pfd);
}
malloc引数に誤ったタイプを指定すると、通常、バッファオーバーランの問題が発生します。
void sample3()
{
struct x *px= (struct x*)malloc(sizeof(struct x*));
x->field = 5; //<< error, as allocated only 4 or 8 bytes depending on pointer size
}
どちらも違います。
通常、mallocは戻ります(void *)。したがって、void *を(struct_t *)に型キャストします。