| |
| |
Preface | |
| |
| |
| |
Introduction | |
| |
| |
Pointers and Memory | |
| |
| |
Why You Should Become Proficient with Pointers | |
| |
| |
Declaring Pointers | |
| |
| |
How to Read a Declaration | |
| |
| |
Address of Operator | |
| |
| |
Displaying Pointer Values | |
| |
| |
Dereferencing a Pointer Using the Indirection Operator | |
| |
| |
Pointers to Functions | |
| |
| |
The Concept of Null | |
| |
| |
Pointer Size and Types | |
| |
| |
Memory Models | |
| |
| |
Predefined Pointer-Related Types | |
| |
| |
Pointer Operators | |
| |
| |
Pointer Arithmetic | |
| |
| |
Comparing Pointers | |
| |
| |
Common Uses of Pointers | |
| |
| |
Multiple Levels of Indirection | |
| |
| |
Constants and Pointers | |
| |
| |
Summary | |
| |
| |
| |
Dynamic Memory Management in C | |
| |
| |
Dynamic Memory Allocation | |
| |
| |
Memory Leaks | |
| |
| |
Dynamic Memory Allocation Functions | |
| |
| |
Using the malloc Function | |
| |
| |
Using the calloc Function | |
| |
| |
Using the realloc Function | |
| |
| |
The alloca Function and Variable Length Arrays | |
| |
| |
Deallocating Memory Using the free Function | |
| |
| |
Assigning NULL to a Freed Pointer | |
| |
| |
Double Free | |
| |
| |
The Heap and System Memory | |
| |
| |
Freeing Memory upon Program Termination | |
| |
| |
Dangling Pointers | |
| |
| |
Dangling Pointer Examples | |
| |
| |
Dealing with Dangling Pointers | |
| |
| |
Debug Version Support for Detecting Memory Leaks | |
| |
| |
Dynamic Memory Allocation Technologies | |
| |
| |
Garbage Collection in C | |
| |
| |
Resource Acquisition Is Initialization | |
| |
| |
Using Exception Handlers | |
| |
| |
Summary | |
| |
| |
| |
Pointers and Functions | |
| |
| |
Program Stack and Heap | |
| |
| |
Program Stack | |
| |
| |
Organization of a Stack Frame | |
| |
| |
Passing and Returning by Pointer | |
| |
| |
Passing Data Using a Pointer | |
| |
| |
Passing Data by Value | |
| |
| |
Passing a Pointer to a Constant | |
| |
| |
Returning a Pointer | |
| |
| |
Pointers to Local Data | |
| |
| |
Passing Null Pointers | |
| |
| |
Passing a Pointer to a Pointer | |
| |
| |
Function Pointers | |
| |
| |
Declaring Function Pointers | |
| |
| |
Using a Function Pointer | |
| |
| |
Passing Function Pointers | |
| |
| |
Returning Function Pointers | |
| |
| |
Using an Array of Function Pointers | |
| |
| |
Comparing Function Pointers | |
| |
| |
Casting Function Pointers | |
| |
| |
Summary | |
| |
| |
| |
Pointers and Arrays | |
| |
| |
Quick Review of Arrays | |
| |
| |
One-Dimensional Arrays | |
| |
| |
Two-Dimensional Arrays | |
| |
| |
Multidimensional Arrays | |
| |
| |
Pointer Notation and Arrays | |
| |
| |
Differences Between Arrays and Pointers | |
| |
| |
Using malloc to Create a One-Dimensional Array | |
| |
| |
Using the realloc Function to Resize an Array | |
| |
| |
Passing a One-Dimensional Array | |
| |
| |
Using Array Notation | |
| |
| |
Using Pointer Notation | |
| |
| |
Using a One-Dimensional Array of Pointers | |
| |
| |
Pointers and Multidimensional Arrays | |
| |
| |
Passing a Multidimensional Array | |
| |
| |
Dynamically Allocating a Two-Dimensional Array | |
| |
| |
Allocating Potentially Noncontiguous Memory | |
| |
| |
Allocating Contiguous Memory | |
| |
| |
Jagged Arrays and Pointers | |
| |
| |
Summary | |
| |
| |
| |
Pointers and Strings | |
| |
| |
String Fundamentals | |
| |
| |
String Declaration | |
| |
| |
The String Literal Pool | |
| |
| |
String Initialization | |
| |
| |
Standard String Operations | |
| |
| |
Comparing Strings | |
| |
| |
Copying Strings | |
| |
| |
Concatenating Strings | |
| |
| |
Passing Strings | |
| |
| |
Passing a Simple String | |
| |
| |
Passing a Pointer to a Constant char | |
| |
| |
Passing a String to Be Initialized | |
| |
| |
Passing Arguments to an Application | |
| |
| |
Returning Strings | |
| |
| |
Returning the Address of a Literal | |
| |
| |
Returning the Address of Dynamically Allocated Memory | |
| |
| |
Function Pointers and Strings | |
| |
| |
Summary | |
| |
| |
| |
Pointers and Structures | |
| |
| |
Introduction | |
| |
| |
How Memory Is Allocated for a Structure | |
| |
| |
Structure Deallocation Issues | |
| |
| |
Avoiding malloc/free Overhead | |
| |
| |
Using Pointers to Support Data Structures | |
| |
| |
Single-Linked List | |
| |
| |
Using Pointers to Support a Queue | |
| |
| |
Using Pointers to Support a Stack | |
| |
| |
Using Pointers to Support a Tree | |
| |
| |
Summary | |
| |
| |
| |
Security Issues and the Improper Use of Pointers | |
| |
| |
Pointer Declaration and Initialization | |
| |
| |
Improper Pointer Declaration | |
| |
| |
Failure to Initialize a Pointer Before It Is Used | |
| |
| |
Dealing with Uninitialized Pointers | |
| |
| |
Pointer Usage Issues | |
| |
| |
Test for NULL | |
| |
| |
Misuse of the Dereference Operator | |
| |
| |
Dangling Pointers | |
| |
| |
Accessing Memory Outside the Bounds of an Array | |
| |
| |
Calculating the Array Size Incorrectly | |
| |
| |
Misusing the sizeof Operator | |
| |
| |
Always Match Pointer Types | |
| |
| |
Bounded Pointers | |
| |
| |
String Security Issues | |
| |
| |
Pointer Arithmetic and Structures | |
| |
| |
Function Pointer Issues | |
| |
| |
Memory Deallocation Issues | |
| |
| |
Double Free | |
| |
| |
Clearing Sensitive Data | |
| |
| |
Using Static Analysis Tools | |
| |
| |
Summary | |
| |
| |
| |
Odds and Ends | |
| |
| |
Casting Pointers | |
| |
| |
Accessing a Special Purpose Address | |
| |
| |
Accessing a Port | |
| |
| |
Accessing Memory using DMA | |
| |
| |
Determining the Endianness of a Machine | |
| |
| |
Aliasing, Strict Aliasing, and the restrict Keyword | |
| |
| |
Using a Union to Represent a Value in Multiple Ways | |
| |
| |
Strict Aliasing | |
| |
| |
Using the restrict Keyword | |
| |
| |
Threads and Pointers | |
| |
| |
Sharing Pointers Between Threads | |
| |
| |
Using Function Pointers to Support Callbacks | |
| |
| |
Object-Oriented Techniques | |
| |
| |
Creating and Using an Opaque Pointer | |
| |
| |
Polymorphism in C | |
| |
| |
Summary | |
| |
| |
Index | |