Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does a const variable store the value in the variable?

Tags:

c++

I was messing around in C++ and wrote this code

#include <iostream>

int main() {
    const int x = 10;
    const int* ptr = &x;

    *((int*)ptr) = 11;

    std::cout << "ptr -> " << ptr << " -> " << *((int*)ptr) << std::endl;
    std::cout << "x ->   " << &x << " -> " << x << std::endl;
}

Interestingly, the output in the console is:

ptr -> 00CFF77C -> 11
x ->   00CFF77C -> 10

I checked the value at the memory address of ptr and the value is 11, so does this imply that const variables store the value in them, and not in memory? And if this were the case, why have a memory address storing the value?

like image 396
ZeroSevenTen Avatar asked Dec 14 '22 09:12

ZeroSevenTen


1 Answers

Your code has Undefined Behavior.

x is a compile time constant, so the compiler expects it to not change value at runtime. As such, the compiler is allowed to optimize code by substituting uses of x's value with the literal value 10 at compile time.

So, at the point where << x is used, your compiler is emitting code for << 10 instead.

But, since your code is also using &x, the compiler is required to make sure that x has a memory address accessible at runtime. That means allocating a physical int and initializing its value to 10. Which you are then fiddling with in an unsafe manner, despite the fact that most compilers will likely place that int in read-only memory.

That is why you are seeing the output you see. But you are lucky your code is not crashing outright, trying to assign a new value to a constant at runtime.

like image 166
Remy Lebeau Avatar answered Jan 28 '23 07:01

Remy Lebeau