Search code examples
cfor-looppointersdeclaration

Dereferencing a pointer in a 'for' loop initializer creates a segmentation fault


I'm having a problem using pointers in a for loop. In my for loop initializer, I dereference an int pointer and give it a value of '0'. When I use that dereferenced pointer in the loop I get a segmentation fault, and I don't understand why. I am using Code::Blocks and the C GNU GCC compiler.

  1. Looking at the watch window I can see that during the for loop the variable has a random number.

  2. It seems that the dereferenced pointer loses scope during the for loop.

The code:

#include <stdio.h>

int main(void)
{
    int val = 0;
    int *p = NULL;
    int answer = 0;

    p = &val;

    *p = 1; // This dereferences and sets to one successfully

    for (int i=3, (*p)=0 ; i>=0; i--) // Here *p is a random number
    {
        printf("do stuff");
        (*p) += 1; // Here it causes a segmentation fault
    }
    answer = *p;
}

I thought that there would be no problems using a pointer the way I am.


Solution

  • Take a close look here:

    for (int i=3, (*p)=0 ; i>=0; i--)
    

    In the first part of the for you're defining a new pointer variable named p which shadows the p defined earlier and initializing it to NULL. You then dereference the NULL pointer in the loop which causes the segfault.

    You can't have both a variable definition and an assignment to an existing variable together like that, so move the assignment of *p to before the loop:

    *p = 0;
    for (int i=3; i>=0; i--)
    

    Or you can define i outside of the loop:

    int i;
    for (i=3, (*p)=0 ; i>=0; i--)
    

    You could squeeze these together by abusing the comma operator:

    for (int i=(*p=0,3) ; i>=0; i--)
    

    Here the assignment to p happens as part of the initializer for i so it doesn't declare a new variable. But I wouldn't recommend this as it would make your code more difficult to read and understand.