1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

int map_int(int n) {
    return n * 7 + 4;
}

#define log_addr(addr) printf("%s == %p\n", (#addr), (void*)(addr))

int main(int argc, char* argv[]) {
    int n = 5;      // stack segment
    int* a_n = &n;  // stack segment
                    //storing address on stack segment
    char* str = "Hello"; // stack segment variable
                         // storing address on data segment
    //int (*function)(int) = map_int; // stack segment
                               // storing address on text segment

    log_addr(a_n);
    log_addr(str);
    //log_addr(function);

    // the address of data of an unknown type
    void* a_unknown = a_n;
    log_addr(a_unknown);    

    int* a_unknown_as_int = a_unknown;
    // C compiler checks: is RHS a void*
    printf("data is %d\n", *a_unknown_as_int);
    
    /* cannot dereference a void*
generic_address.c: In function ‘main’:
generic_address.c:31:25: warning: dereferencing ‘void *’ pointer
  printf("data is %d\n", *a_unknown);
                         ^~~~~~~~~~
generic_address.c:31:25: error: invalid use of void expression
    */
    //printf("data is %d\n", *a_unknown);
    
    // cannot index void address
    // a_unknown[0] = 5;
    // *(a_unknown + 0) == a_unknown[0]
    /*
generic_address.c: In function ‘main’:
generic_address.c:41:11: warning: dereferencing ‘void *’ pointer
  a_unknown[0] = 5;
           ^
generic_address.c:41:15: error: invalid use of void expression
  a_unknown[0] = 5;
               ^
    */

    // bad code quality: can lead to bugs
    //int* a_casted_to_int = (int*)str;

    return EXIT_SUCCESS;
}
/* vim: set tabstop=4 shiftwidth=4 fileencoding=utf-8 noexpandtab: */

© Copyright 2022 Alexander J. Quinn         This content is protected and may not be shared, uploaded, or distributed.