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

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 \{\} \;