home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #20 / NN_1992_20.iso / spool / comp / std / c / 2629 < prev    next >
Encoding:
Text File  |  1992-09-15  |  1.5 KB  |  85 lines

  1. Path: sparky!uunet!noc.near.net!news.bbn.com!indian.bbn.com!langevin
  2. From: langevin@indian.bbn.com (Tim Langevin)
  3. Newsgroups: comp.std.c
  4. Subject: Memory alignment
  5. Date: 15 Sep 1992 16:27:26 GMT
  6. Organization: Bolt Beranek and Newman Inc., Cambridge MA
  7. Lines: 72
  8. Distribution: world
  9. Message-ID: <lbc3neINNtt@news.bbn.com>
  10. Reply-To: langevin@indian.bbn.com. (Tim Langevin)
  11. NNTP-Posting-Host: bbn.com
  12.  
  13. I'd like the net.wisdom on this one...
  14.  
  15.    Is the following piece of code conforming ANSI C?
  16.    Is there a better way to do this?
  17.  
  18. Thanks,
  19.  
  20. Tim Langevin
  21.  
  22.  
  23. **start here**
  24.  
  25. #include <stddef.h>
  26. #include <stdlib.h>
  27.  
  28. typedef union
  29. {
  30.   enum { red, green, blue } a;
  31.   signed char b;
  32.   unsigned char c;
  33.   short d;
  34.   unsigned short e;
  35.   int f;
  36.   unsigned int g;
  37.   long h;
  38.   unsigned long i;
  39.   float j;
  40.   double k;
  41.   long double l;
  42.   char * m;
  43. } ALL_TYPES;
  44.  
  45. typedef struct 
  46. {
  47.   size_t size;
  48.   void *next;
  49.   ALL_TYPES aligner;
  50. } HEADER;
  51.  
  52. #define TEST_SIZE 20
  53.  
  54. void *get_mem (size_t size);
  55. void free_mem (void * mem_ptr);
  56.  
  57. int main (void)
  58. {
  59.     void * mem_ptr;
  60.     mem_ptr = get_mem (TEST_SIZE);
  61.     free_mem (mem_ptr);
  62.     return 0;
  63. }
  64.  
  65. void *get_mem (size_t user_size)
  66. {
  67.     void * mem_ptr;
  68.     HEADER *header;
  69.  
  70.     mem_ptr = malloc (sizeof (HEADER) + user_size);
  71.     header = (HEADER *) mem_ptr;
  72.     header->size = user_size;
  73.     header->next = 0;
  74.  
  75.     return (void *) ((char *)mem_ptr + sizeof(HEADER));
  76. }
  77.  
  78. void free_mem (void * mem_ptr)
  79. {
  80.     free ( (void *) ((char *) mem_ptr - sizeof (HEADER)));
  81. }
  82.  
  83.  
  84.  
  85.