I recently started programming in C again after having programmed in C++ for a while, and my understanding of pointers is a bit rusty.
I would like to ask why this code is not causing any errors:
char* a = NULL; {     char* b = "stackoverflow";     a = b; }  puts(a); I thought that because b went out of scope, a should reference a non-existing memory location, and thus their would be a runtime error when calling printf. 
I ran this code in MSVC about 20 times, and no errors were shown.
Inside the scope where b is defined, it is assigned the address of a string literal.  These literals typically live in a read-only section of memory as opposed to the stack.
When you do a=b you assign the value of b to a, i.e. a now contains the address of a string literal.  This address is still valid after b goes out of scope.
If you had taken the address of b and then attempted to dereference that address, then you would invoke undefined behavior.
So your code is valid and does not invoke undefined behavior, but the following does:
int *a = NULL; {     int b = 6;     a = &b; }  printf("b=%d\n", *a); Another, more subtle example:
char *a = NULL; {     char b[] = "stackoverflow";     a = b; }  printf(a); The difference between this example and yours is that b, which is an array, decays to a pointer to the first element when assigned to a.  So in this case a contains the address of a local variable which then goes out of scope.
EDIT:
As a side note, it's bad practice to pass a variable as the first argument of printf, as that can lead to a format string vulnerability.  Better to use a string constant as follows:
printf("%s", a); Or more simply:
puts(a); 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