0

これの間に本当の違いがあるかどうか知りたいです:

c = (struct_t *) malloc(sizeof(struct_t));

この

c = malloc(sizeof(struct_t *));

キャストを回避することに加えて、コンパイラーは最初の形式を尊重して2番目の形式で何らかの利点を利用していますか?または、2つの方法は完全に同じであり、単なる「美的」な質問ですか?

4

5 に答える 5

6

最初はsizeof(struct_t)バイトを割り当て、2番目はsizeof(struct_t*)バイトを割り当てます。

mallocそれを除けば、結果をキャストするかどうかに関係なく、何をするかに違いはありません。結果をキャストすると、コードはC ++コンパイラーに受け入れられますが、インクルードしないという間違いを隠すことができるためstdlib.h、結果をCでキャストしないことが広く推奨されます。

于 2013-03-12T10:06:59.773 に答える
5

2つは完全に異なります。1つ目は構造体のインスタンスを割り当て、2つ目は構造体へのポインターを割り当てます。

一般に、同じバイト数を割り当てることすらありません。

于 2013-03-12T10:07:23.510 に答える
3

いいえ、同じではありません。後者は構造体へのポインタに4バイトまたは8バイトのスペースを割り当て、前者は構造体自体に十分なスペースを割り当てます。

sizeof(struct_t)が十分に小さい場合、およびmallocが実際に要求よりも多くを割り当てる場合、ユーザーには違いが表示されない場合があります。

于 2013-03-12T10:08:24.133 に答える
1

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
}
于 2013-03-12T14:28:55.867 に答える
0

どちらも違います。

通常、mallocは戻ります(void *)。したがって、void *を(struct_t *)に型キャストします。

于 2013-03-12T12:06:25.447 に答える