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
“The Lost Art of C Structure Packing”: http://www.catb.org/esr/structure-packing/
Notable C Libraries
yajl (“Yet Another JSON Library”): portable, incremental, simple, error messages.
Zed Shaw Notes
- cachegrind/callgrind: http://c.learncodethehardway.org/book/ex41.html
- bstring (“better string”): http://c.learncodethehardway.org/book/ex36.html
- testing: http://c.learncodethehardway.org/book/ex30.html
- debug macros: http://c.learncodethehardway.org/book/ex20.html
Auto-Indent Styling
Via riolet, this one-liner will auto-indent files::
find . \( -name '*.c' -o -name '*.h' \) -exec indent --no-tabs --linux-style --line-length 90 --indent-level 4 -bli0 \{\} \;