REVIEW - Effective C - An Introduction to Professional C Programming


Effective C - An Introduction to Professional C Programming


Robert Seacord




No Starch Press (2020)




David Sullivan


May 2021



Verdict: Highly recommended

This book was a very interesting read: it’s a robust exposition of the C language. The author is an esteemed Technical Director. He is also an expert on the international standards working group for C (as also is the contributor) and author of many C and C++ books.

In brief: this book contains a rich amount of quality information on the C language and programming. It’s clearly written, with good, pithy examples. C programming for Windows and for Linux environments is covered, with perhaps a very slight bias toward the Windows platform. It covers C17 and C2x versions of the standard, and mentions C changes introduced in C99, C11 and C17.

The book starts by covering Getting Started; Objects, Functions, Types; Arithmetic Types; Expressions and Operators; Control Flow. And it covers these basic topics extensively. This, the first half (comprising five chapters) of the book, makes an excellent, detailed reference to C basics.

A surprising omission here was no mention of pointers to pointers. Also pointers to functions were only skimmed over.

Chapter 6 covers Dynamic Memory. This chapter was especially impressive. As is typical for the book, it covers the subject matter extensively, with good, pithy examples. Topics include avoiding memory leaks, reallocation, aligned allocation, memory managers, double free vulnerabilities, flexible arrays, variable length arrays, and debugging memory allocation and touches on dynamic memory in safety critical systems. There is a debugging memory allocation library recommended (looks really useful) and some helpful information on how to use it.

Generally there is rich detail of information contained within this book, with some very useful references for those interested in learning more. The author’s undoubted expertise and experience shows whilst reading this book.

Chapter 7, on Characters and Strings, was for me as impressive as the previous chapter. General string handling, plus ASCII, Unicode, character sets and character types for both Windows and Linux are well covered.

Chapter 8, I/O is again extensive but focuses mainly on buffered I/O. I would have liked to have seen a little more information on low level I/O, and some information on when one may wish to use the low level I/O in preference to the more common buffered I/O approach. Note: this is a minor complaint.

Chapter 9 does a great job on the Preprocessor, and the book concludes with two invaluable chapters with a Engineering bent on Program Structure, and Debugging, Testing and Analysis. There is good information here to get a learner started building C software, testing and fixing the inevitable errors which occur.

This book is concise: pointers are covered in two pages at the start of the book. Function pointers get half a page. I expected more here, considering the book’s remit and this is a key concept that the student needs to learn to become proficient in C.

At the beginning of the book’s introduction is “It [The book] is written to be as accessible as possible to anyone who wants to learn C programming, without dumbing it down.”. It’s a difficult balance to get right, of course. The book does cover a large amount of material.

Well, I’m not sure the author has the balance quite right here. It does not present information in a way to best help the reader learn. Which is a real shame as this book does contain a wealth of good material. My background includes teaching C programming, so my judgement undoubtedly has bias with regard to the educational merit of resources.

There are a few places where an italicised paragraph is marked with highlighted text to the side. I would like to have seen more of these. Take buffer overflows for example. A very common C programming error, the root cause of a legion of software vulnerabilities. It’s described very well in the book, but the description (inside the While Statement section) lacks annotation to mark its importance.

A very minor annoyance was a few places where an operator, a term or topic where used with no introduction – before it was described in the book.

Despite some criticisms, this is still an excellent book. Highly recommended, but if you are learning C anew, check the book to see if it suits your learning style.