I’m trying to understand how pointers to statically allocated objects work and where they can go wrong.
I wrote this code:
int* pinf = NULL;
for (int i = 0; i<1;i++) {
int inf = 4;
pinf = &inf;
}
cout<<"inf"<< (*pinf)<<endl;
I was surprised that it worked becasue I thought that inf would dissapear when the program left the block and the pointer would point to something that no longer exists. I expected a segmentation fault when trying to access pinf. At what stage in the program would inf die?
Your understanding is correct.
infdisappears when you leave the scope of the loop, and so accessing*pinfyields undefined behavior. Undefined behavior means the compiler and/or program can do anything, which may be to crash, or in this case may be to simply chug along.This is because
infis on the stack. Even when it is out of scopepinfstill points to a useable memory location on the stack. As far as the runtime is concerned the stack address is fine, and the compiler doesn’t bother to insert code to verify that you’re not accessing locations beyond the end of the stack. That would be prohibitively expensive in a language designed for speed.For this reason you must be very careful to avoid undefined behavior. C and C++ are not nice the way Java or C# are where illegal operations pretty much always generate an immediate exception and crash your program. You the programmer have to be vigilant because the compiler will miss all kinds of elementary mistakes you make.