software/c
C Programming Language
K&R Notes (unstructured)
With pointer arithmatic, the type of foo *p is taken into account automagically. Eg, p+3 -> 0xFEFE0000 + 3 * (sizeof foo).
Examples of tricky pointer sytax::
int *ip;
(++*p)
(*p++)
++(*p)
*(++p)
In the context of references like function declarations, only the size of the first dimension of a multi-dimensional array is free; the others must be specified explicitly::
void copy_2d_array(int a[][10], int b[][10]); // Ok
void copy_2d_array(int a[][], int b[][]); // Invalid
void copy_2d_array(int a[10][], int b[10][]); // Invalid
Negative indexing of arrays is “allowed” (reads ahead of the array in memory); need to check for that case explicitly.
_FORTIFY_SOURCE does what it says.
In C99 can int* p replace int *p? Seems like yes.
The “update statement” of a for loop gets executed at the /end/ of every loop, which means an iteration variable gets updated once more than might be expected::
int i;
for(i = 0; i < 10; i++) {
}
printf("%d\n", i); // prints 10, not 9
Any ‘inline’ should probably be ‘static’ (local linkage).
Other References
“Spiral Rule” trick for understanding type/pointer definitions: http://c-faq.com/decl/spiral.anderson.html
Notable C Libraries
yajl (“Yet Another JSON Library”): portable, incremental, simple, error messages.
