Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

initializing a structure array using memset

Tags:

gcc 4.4.4 c89

I have the following structure.

struct device_sys {     char device[STRING_SIZE];     int id;     char category; };  int main(void) {     struct device_sys dev_sys[NUM_DEVICES];      memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(dev_sys));      return 0;  } 

I get a stack dump when I call memset. Is this not the correct way to initialize an structure array?

like image 798
ant2009 Avatar asked Aug 02 '10 15:08

ant2009


1 Answers

Either

memset(&dev_sys, 0, sizeof dev_sys); 

or

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

Or, if you prefer

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

but not what you have in your original variant.

Note, that in your specific case in all variants you can use either &dev_sys or dev_sys as the first argument. The effect will be the same. However, &dev_sys is more appropriate in the first variant, since if follows the memset(ptr-to-object, object-size) idiom. In the second and third variants it is more appropriate to use dev_sys (or &dev_sys[0]), since it follows the memset(ptr-to-first-element, number-of-elements * element-size) idiom.

P.S. Of course, instead of using all that hackish memset trickery, in your particular case you should have just declared your array with an initializer

struct device_sys dev_sys[NUM_DEVICES] = { 0 }; 

No memset necessary.

like image 109
AnT Avatar answered Sep 20 '22 20:09

AnT