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: "The Lost Art of C Structure Packing": Notable C Libraries --------------------- [yajl](https://github.com/lloyd/yajl) ("Yet Another JSON Library"): portable, incremental, simple, error messages. Zed Shaw Notes ---------------- * cachegrind/callgrind: * bstring ("better string"): * testing: * debug macros: Auto-Indent Styling --------------------- Via [riolet](https://github.com/riolet/WAFer), 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 \{\} \;