Advertisement
xathrya

Pointers to Pointer

Feb 6th, 2017
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.67 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4.  
  5. typedef void* pointer;
  6.  
  7. pointer* create_rantai(int n, pointer ref)
  8. {
  9.     n--;
  10.     if (n <= 0)
  11.         return ref;
  12.     else {
  13.         pointer *tmp = (pointer*) malloc(sizeof(pointer));
  14.         *tmp = create_rantai(n, ref);
  15.         return tmp;
  16.     }
  17. }
  18.  
  19. void free_rantai(int n, pointer* rantai)
  20. {
  21.     n--;
  22.     if (n <= 0)
  23.     {
  24.         // first pointer is pointing to concrete value so cannot be freed
  25.         return;
  26.     } else {
  27.         free_rantai(n, *rantai);
  28.         free(rantai);
  29.     }
  30. }
  31.  
  32. void show_rantai(int n, pointer* rantai)
  33. {
  34.     int i;
  35.     pointer* ptr;
  36.    
  37.     printf("Displaying %d node of pointers:\n", n);
  38.     for (i=0, ptr = rantai; i<n; i++)
  39.     {
  40.         printf("[%d] [%p] => [%x]\n", i, ptr, *ptr);
  41.         ptr = (pointer*) *ptr;
  42.     }
  43. }
  44.  
  45. int main()
  46. {
  47.     int depth=5;
  48.     int nilai = 135;
  49.     pointer *tmp;
  50.    
  51.     uint64_t alamat;
  52.     uint64_t derefer;
  53.    
  54.     printf("val[nilai] = %d [%x]\n", nilai, nilai);
  55.     printf("addr[nilai]= %p\n", &nilai);
  56.    
  57.     // Manual
  58.     int *d1 = &nilai;
  59.     int **d2 = &d1;
  60.     int ***d3 = &d2;
  61.     int ****d4 = &d3;
  62.     int *****d5 = &d4;
  63.     int ******d6 = &d5;
  64.    
  65.     show_rantai(depth, (pointer*) d5);
  66.    
  67.     // Dynamic rantai
  68.     tmp = create_rantai(depth, (pointer) &nilai);
  69.     show_rantai(depth, tmp);
  70.     free_rantai(depth, tmp);
  71.    
  72.     do {
  73.         printf("Depth: ");
  74.         scanf("%d", &depth);
  75.        
  76.         if (depth == 0)
  77.             break;
  78.        
  79.         nilai ++;
  80.         tmp = create_rantai(depth, (pointer) &nilai);
  81.         show_rantai(depth, tmp);
  82.        
  83.         do {
  84.             printf("Inspecting addr: ");
  85.             scanf("%p", &alamat);
  86.             if (alamat == 0)
  87.                 break;
  88.             derefer = *((uint64_t*)alamat);
  89.             printf("debug => %x %d\n", derefer, derefer);
  90.         } while (alamat != 0);
  91.        
  92.         free_rantai(depth, tmp);
  93.     } while (depth != 0);
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement