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 61 62 | #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#define log_addr(n) printf("%s == %p\n", #n, (void*)(n))
#define log_int(n) printf("%s == %x\n", #n, n)
#define log_str(n) printf("%s == \"%s\"\n", #n, n)
int main(int argc, char* argv[]) {
int n = 0x1234;
int* a_n = &n;
const char* str = "Hello";
char str2[] = "World";
void* a_unknown = a_n;
log_addr(a_n);
log_addr(str);
log_addr(str2);
log_addr(a_unknown);
a_unknown = str2;
log_addr(a_unknown);
const void* a_unknown_constant = str;
log_addr(a_unknown_constant);
a_unknown_constant = a_n;
log_addr(a_unknown_constant);
int* a_unknown_as_int = a_unknown;
log_int(*a_unknown_as_int);
a_unknown = a_n;
char* a_unknown_as_str = a_unknown;
log_str(a_unknown_as_str);
// you cannot directly dereference a void* address
// gives a compiler error
//log_int(*a_unknown);
//log_addr(a_unknown + 10);
log_addr(a_n + 10);
if (a_unknown < a_unknown_constant) {
printf("a_unknown is smaller\n");
}
// bad cast: discards const qualifier
// we could write this assigbment without the cast and it would
// be validated by the compiler
a_unknown = (void*) str;
log_addr(a_unknown);
// bad: unneeded cast caused an "accidental" wrong assignment
// its easy when using unneeded casts to do an assignment that is
// invalid
a_unknown_as_int = (int*) str2;
log_addr(a_unknown_as_int);
return EXIT_SUCCESS;
}
/* vim: set tabstop=4 shiftwidth=4 fileencoding=utf-8 noexpandtab: */
|
© Copyright 2024 Alexander J. Quinn & David Burnett This content is protected and may not be shared, uploaded, or distributed.