这是一个结构:
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));
有什么区别?
答案 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)
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))))
也许是另一种选择。沿着这些方向,不太可能使错误成为可能。