Understanding Pointer Aliasing in C and the `restrict` Keyword

Saeed Hasani
3 min readDec 4, 2023

Pointers in C can be powerful tools for working with memory, but they come with their own set of challenges. One of these challenges is pointer aliasing, which occurs when two or more pointers refer to the same memory location. This can lead to unexpected behavior, especially when modifying data through one pointer affects data accessed through another pointer.

In this blog, we’ll explore a simple example to illustrate the problem of aliasing and how it can be addressed using the restrict keyword in C.

This is me learning and programming :)

Pointer Aliasing Example

Consider the following C code:

#include <stdio.h>

void modify_values(int *a, int *b) {
*a = 10;
*b = 20;
}

int main() {
int x = 5;
int *ptr1 = &x;
int *ptr2 = &x;

printf("Original value: %d\n", x);

// Call a function that modifies the values through two pointers
modify_values(ptr1, ptr2);

printf("Modified value: %d\n", x);

return 0;
}

In this example, modify_values is a function that takes two pointers and modifies the values they point to. The issue arises when ptr1 and ptr2 both point to the same memory location (x). When modify_values modifies the values through ptr1, those changes are visible through ptr2 as well, leading to unexpected behavior.

Introducing the restrict Keyword

To address the problem of pointer aliasing, C provides the restrict keyword. The restrict keyword is a type qualifier that hints to the compiler that the pointer is the only reference to the allocated memory during its lifetime. This allows the compiler to perform optimizations, potentially improving the performance of the code.

Here’s how we can use restrict in the previous example:

#include <stdio.h>

void modify_values(int *restrict a, int *restrict b) {
*a = 10;
*b = 20;
}

int main() {
int x = 5;
int *ptr1 = &x;
int *ptr2 = &x;

printf("Original value: %d\n", x);

// Call a function that modifies the values through two restricted pointers
modify_values(ptr1, ptr2);

printf("Modified value: %d\n", x);

return 0;
}

By using restrict, we inform the compiler that ptr1 and ptr2 do not alias each other, allowing the compiler to perform optimizations.

Conclusion

Understanding pointer aliasing and using the restrict keyword can help prevent unexpected behavior and improve the performance of your C code. However, it's crucial to use restrict carefully and ensure that the pointers are genuinely non-aliasing to avoid undefined behavior.

I hope this blog post has provided insights into pointer aliasing and the restrict keyword in C. Feel free to experiment with the code examples and explore further in your projects.

Happy coding!

Saeed

--

--

Saeed Hasani
Saeed Hasani

No responses yet