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.
Looking at the watch window I can see that during the for
loop the variable has a random number.
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.
Dereferencing a pointer means getting the value that is stored in the memory location pointed by the pointer. The operator * is used to do this, and is called the dereferencing operator.
To quote from Wikipedia: Dereferencing the NULL pointer typically results in an attempted read or write from memory that is not mapped - triggering a segmentation fault or access violation. This may represent itself to the developer as a program crash, or be transformed into an exception that can be caught.
In computer programming, a dereference operator, also known as an indirection operator, operates on a pointer variable. It returns the location value, or l-value in memory pointed to by the variable's value.
Dereferencing means taking away the reference and giving you what it was actually referring to. A pointer to something really means that your pointer variable holds a memory address of something . But the pointer can also be thought of as a reference to something instead.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With