первый параметр в memset передавая массив или указатель - PullRequest
0 голосов
/ 13 августа 2010

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));

Большое спасибо за любой совет,

1 Ответ

4 голосов
/ 13 августа 2010

Что у вас есть:

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)

Обратите внимание, что последний работает только в том случае, если dev действительно массив - как в этом случае. Если вместо этого у вас есть указатель на первый элемент массива, вам нужно будет использовать первую версию.

...