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.