1

gcc 4.4.4 c89

ポインタは配列と同じではありません。しかし、配列はポインタに崩壊する可能性があります。

最初のパラメーターがポインターであるmemsetを使用していました。構造体配列を初期化したいのですが。

すなわち

struct devices
{
    char name[STRING_SIZE];
    size_t profile;
    char catagory;
};

struct devices dev[NUM_DEVICES];

memset(dev, 0, (size_t)NUM_DEVICES * sizeof(*dev));

dev ==&dev [0]

しかし、最初のパラメーターを渡す必要があります:これがあります:

 memset(&dev, 0, (size_t)NUM_DEVICES * sizeof(*dev));

アドバイスをありがとう、

4

1 に答える 1

4

あなたが持っているもの:

memset(dev, 0, (size_t)NUM_DEVICES * sizeof(*dev));

結構です-配列の最初の要素へのポインタと配列のサイズを渡します。ただし、(size_t)キャストは不要であり(sizeofタイプsize_tがあるため、正しいプロモーションが発生します)、この場合dev[0]よりも明確であることがわかります。*dev

memset(dev, 0, NUM_DEVICES * sizeof dev[0]);

または、アドレスとして使用することもできます。&devこの場合、使用する方がおそらくより明確ですsizeof dev-配列全体のサイズ:

memset(&dev, 0, sizeof dev);

sizeof最初のパラメーターは、最後のパラメーターの対象となる型へのポインターであることが一般的に最善であるため、これはより明確であると言います。はmemset()、次のいずれかの形式のようになります。

memset(p, ..., N * sizeof p[0])
memset(&x, ..., sizeof x)

ただし、この最後の1つdevは、実際に配列である場合にのみ機能することに注意してください。この場合のように。代わりに、配列の最初の要素へのポインターがある場合は、最初のバージョンを使用する必要があります。

于 2010-08-13T05:01:26.273 に答える