使用Sizeof运算符的C中的Memset:

时间:2011-04-12 09:43:24

标签: c

这是一个结构:

typedef struct tag_device_sys
{
    char device[STRING_SIZE];
    int id;
    char category;
} device_sys;

对于memset,应该从下面使用哪一个?

memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(device_sys));

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

有什么区别?

6 个答案:

答案 0 :(得分:9)

我喜欢将对象用作sizeof

的参数
struct whatever *ptr;
/* ... */
ptr = malloc(nelems * sizeof *ptr);
memset(ptr, 0, nelems * sizeof *ptr);

使用括号类型的优点是,如果数据类型发生变化,则只需要在一个地方更改代码

struct before_change *ptr;
/* ... */
ptr = malloc(nelems * sizeof (struct before_change));
memset(ptr, 0, nelems * sizeof (struct before_change));

答案 1 :(得分:0)

dev_sys是一个指针。 sizeof(dev_sys)只会为您提供平台指针的大小。

答案 2 :(得分:0)

如果dev_sys被malloced为memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(device_sys))

,则

(NUM_DEVICES * sizeof(device_sys))应该有效

答案 3 :(得分:0)

绝对

memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(device_sys));

有几种情况,如果你有:

1)静态数组,在该上下文中使用sizeof:

device_sys dev_sys[NUM_DEVICES] = { /* init data * };
...
sizeof(dev_sys);

在这种情况下,sizeof运算符将给出数组的整个大小,因此您最终将得到:

NUM_DEVICES * (NUM_DEVICES * sizeof(device_sys))

2)或者您通过指针获得了动态分配的内存块,或者您在函数调用的上下文中将dev_sys作为函数参数传递。无论哪种方式:

sizeof(dev_sys)将给出一个指针的大小(在第一个,因为它是一个指针,在第二个,由于指针衰减),whcih很可能不是你所追求的。

答案 4 :(得分:0)

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

始终按照您编写的方式工作,建议dev_sys是指针或数组。 sizeof(*dev_sys)为我们提供了第一个元素的大小。

在任何情况下,我都会写为

device_sys dev_sys[NUM_DEVICES];

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

device_sys *dev_sys = (device_sys *) calloc(NUM_DEVICES, sizeof(*dev_sys));

取决于您是希望堆栈上还是堆上的dev_sys

答案 5 :(得分:0)

Richard Stevens(Unix环境中的高级编程等)建议使用bzero()或您自己的便携式等效项,因为它避免了交换memset()参数的常见错误。你甚至可以制作一个单{arg宏ZERO(obj)bzero(obj, sizeof(*obj))。或者ZERO(object) (memset (&(object), '\0', sizeof ((object))))也许是另一种选择。沿着这些方向,不太可能使错误成为可能。