It's been a long time since one of those 'fundamental' programming ideas bit me. Thankfully, it happened on one of my personal projects, so I didn't reveal to anyone my stupidity.
Errrr... Damn.
Anyway, here was my header file:
extern unsigned int *vectors;
And, here was my (equivalent) .C file:
unsigned int vectors[512];
I was actually mixing languages here. In writing the header, I fell into the trap of thinking pointers are equivalent to arrays. They aren't. The C language creates confusion here because it let's us use array syntax with pointers, and arrays can turn into pointers. We can illustrate this very clearly -
Example 1 .....
char array[15] = { 0 };
printf("%x\n", (unsigned long) array);
printf("%x\n", (unsigned long) &array);
.....
versus
Example 2 .....
char *array = 0;
printf("%x\n", (unsigned int) array );
printf("%x\n", (unsigned int) &array );
.....
Take a look at the output of both programs, and you'll see the exact difference between arrays and pointers. An array without an index is nothing more than a constant pointing to the memory address the array starts at. In a very real way, it doesn't 'exist' as an array, just as a convenience for a block of memory. Here's the breakdown, with this declaration:
char array[15] -
array - is defined as a constant with a value of the address of the start of the array
&array - is the address of the first element
Using an array is a lot like using a statically defined memory address -
char* my_ptr = (char*) 0xB8000;
2 months ago
No comments:
Post a Comment