In the code below i successfully compile it but i can\'t understand why for certain values of number the program crash and for other values it\'s not. Could someone explain the
In C++, ""
is a const char[1]
array, which decays into a const char*
pointer to the first element of the array (in this case, the string literal's '\0'
nul terminator).
Adding an integer to a pointer performs pointer arithmetic, which will advance the memory address in the pointer by the specified number of elements of the type the pointer is declared as (in this case, char
).
So, in your example, ... << ("" + number) << ...
is equivalent to ... << &""[number] << ...
, or more generically:
const char *ptr = &""[0];
ptr = reinterpret_cast(
reinterpret_cast(ptr)
+ (number * sizeof(char))
);
... << ptr << ...
Which means you are going out of bounds of the array when number
is any value other than 0, thus your code has undefined behavior and anything could happen when operator<<
tries to dereference the invalid pointer you give it.
Unlike in many scripting languages, ("" + number)
is not the correct way to convert an integer to a string in C++. You need to use an explicit conversion function instead, such as std::to_string(), eg:
#include
#include
int main()
{
long int number = 255;
std::cout << "Value 1 : " << std::flush << std::to_string(number) << std::flush << std::endl;
number = 15155;
std::cout << "Value 2 : " << std::flush << std::to_string(number) << std::flush << std::endl;
return 0;
}
Or, you can simply let std::ostream::operator<< handle that conversion for you, eg:
#include
int main()
{
long int number = 255;
std::cout<< "Value 1 : " << std::flush << number << std::flush << std::endl;
number = 15155;
std::cout<< "Value 2 : " << std::flush << number << std::flush << std::endl;
return 0;
}