code_junkie

Flexible array members in C - bad?

Nov 12th, 2011
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.10 KB | None | 0 0
  1. struct header {
  2. size_t len;
  3. unsigned char data[];
  4. };
  5.  
  6. struct header {
  7. size_t len;
  8. unsigned char data[1];
  9. };
  10.  
  11. ptr = malloc(sizeof(struct header) + (n-1));
  12.  
  13. struct header
  14. {
  15. size_t len;
  16. unsigned char data[];
  17. };
  18.  
  19. unsigned char data[0];
  20.  
  21. foo = malloc(sizeof(header) + N * sizeof(data[0]));
  22. foo->len = N;
  23.  
  24. struct header
  25. {
  26. size_t len;
  27. unsigned char *data;
  28. };
  29.  
  30. struct header *my_header
  31. = malloc(offsetof(struct header, data) + n * sizeof my_header->data);
  32.  
  33. #define FLEXIBLE_SIZE SIZE_MAX /* or whatever maximum length for an array */
  34. #define SIZEOF_FLEXIBLE(type, member, length)
  35. ( offsetof(type, member) + (length) * sizeof ((type *)0)->member[0] )
  36.  
  37. struct header {
  38. size_t len;
  39. unsigned char data[FLEXIBLE_SIZE];
  40. };
  41.  
  42. ...
  43.  
  44. size_t n = 123;
  45. struct header *my_header = malloc(SIZEOF_FLEXIBLE(struct header, data, n));
  46.  
  47. struct header *my_header = malloc(sizeof *my_header);
  48.  
  49. struct header {
  50. size_t len;
  51. unsigned char *data;
  52. };
  53.  
  54. struct header *p;
  55. p = malloc(sizeof(*p) + len + 1 );
  56. p->data = (unsigned char*) (p + 1 ); // memory after p is mine!
Add Comment
Please, Sign In to add comment