Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- typedef void* pointer;
- pointer* create_rantai(int n, pointer ref)
- {
- n--;
- if (n <= 0)
- return ref;
- else {
- pointer *tmp = (pointer*) malloc(sizeof(pointer));
- *tmp = create_rantai(n, ref);
- return tmp;
- }
- }
- void free_rantai(int n, pointer* rantai)
- {
- n--;
- if (n <= 0)
- {
- // first pointer is pointing to concrete value so cannot be freed
- return;
- } else {
- free_rantai(n, *rantai);
- free(rantai);
- }
- }
- void show_rantai(int n, pointer* rantai)
- {
- int i;
- pointer* ptr;
- printf("Displaying %d node of pointers:\n", n);
- for (i=0, ptr = rantai; i<n; i++)
- {
- printf("[%d] [%p] => [%x]\n", i, ptr, *ptr);
- ptr = (pointer*) *ptr;
- }
- }
- int main()
- {
- int depth=5;
- int nilai = 135;
- pointer *tmp;
- uint64_t alamat;
- uint64_t derefer;
- printf("val[nilai] = %d [%x]\n", nilai, nilai);
- printf("addr[nilai]= %p\n", &nilai);
- // Manual
- int *d1 = &nilai;
- int **d2 = &d1;
- int ***d3 = &d2;
- int ****d4 = &d3;
- int *****d5 = &d4;
- int ******d6 = &d5;
- show_rantai(depth, (pointer*) d5);
- // Dynamic rantai
- tmp = create_rantai(depth, (pointer) &nilai);
- show_rantai(depth, tmp);
- free_rantai(depth, tmp);
- do {
- printf("Depth: ");
- scanf("%d", &depth);
- if (depth == 0)
- break;
- nilai ++;
- tmp = create_rantai(depth, (pointer) &nilai);
- show_rantai(depth, tmp);
- do {
- printf("Inspecting addr: ");
- scanf("%p", &alamat);
- if (alamat == 0)
- break;
- derefer = *((uint64_t*)alamat);
- printf("debug => %x %d\n", derefer, derefer);
- } while (alamat != 0);
- free_rantai(depth, tmp);
- } while (depth != 0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement