Саша
Саша

Reputation: 847

Is it possible to get the valid hex address of CHAR in C++?

I am trying to get the valid memory address of CHAR A4 and b5 but when I try to reach that address using Hex Editor it's not reading the address that I have already got in my console output after compiling. Hex Editor is validating the address as invalid address.

My Code:

    #include <iostream>
using namespace std;
main ()
{
{   //INT
    cout << "INT" << '\n';
    int a = 2, b = 3;
    cout << "Result: " << "for " << "int a " << "= " << a << '\n';
    cout << "Result: " << "for " << "int a " << "= " << a << " " << "at " << "address " << &a << '\n';
    cout << "Result: " << "for " << "int b " << "= " << b << '\n';
    cout << "Result: " << "for " << "int b " << "= " << b << " " << "at " << "address " << &b << '\n';
    cout << "-----------------------------------------" << '\n';
}
{
    //SHORT
    cout << "SHORT" << '\n';
    short a = 2, b = 3;
    cout << "Result: " << "for " << "short a " << "= " << a << '\n';
    cout << "Result: " << "for " << "short a " << "= " << a << " " << "at " << "address " << &a << '\n';
    cout << "Result: " << "for " << "short b " << "= " << b << '\n';
    cout << "Result: " << "for " << "short b " << "= " << b << " " << "at " << "address " << &b << '\n';
    cout << "-----------------------------------------" << '\n';
}
{
    //FLOAT
    cout << "FLOAT" << '\n';
    float a = 2, b = 3.1;
    cout << "Result: " << "for " << "float a " << "= " << a << '\n';
    cout << "Result: " << "for " << "float a " << "= " << a << " " << "at " << "address " << &a << '\n';
    cout << "Result: " << "for " << "float b " << "= " << b << '\n';
    cout << "Result: " << "for " << "float b " << "= " << b << " " << "at " << "address " << &b << '\n';
    cout << "-----------------------------------------" << '\n';
}
{
//DOUBLE
    cout << "DOUBLE" << '\n';
    double a = 20, b = 30.1;
    cout << "Result: " << "for " << "double a " << "= " << a << '\n';
    cout << "Result: " << "for " << "double a " << "= " << a << " " << "at " << "address " << &a << '\n';
    cout << "Result: " << "for " << "double b " << "= " << b << '\n';
    cout << "Result: " << "for " << "double b " << "= " << b << " " << "at " << "address " << &b << '\n';
    cout << "-----------------------------------------" << '\n';
}
{
//CHAR
    cout << "CHAR" << '\n';
    char A4 = 'A' , b5 = 'B' ;
    cout << "Result: " << "for " << "Char A4 " << "= " << A4 << '\n';
    cout << "Result: " << "for " << "Char A4 " << "= " << A4 << " " << "at " << "address " << &A4 << '\n';
    cout << "Result: " << "for " << "Char b5 " << "= " << b5 << '\n';
    cout << "Result: " << "for " << "Char b5 " << "= " << b5 << " " << "at " << "address " << &b5 << '\n';
    cout << "-----------------------------------------" << '\n';
}
}

Upvotes: 1

Views: 326

Answers (2)

Alan Birtles
Alan Birtles

Reputation: 36379

char A4 = 'A';
cout << &A4;

Is printing char*, when you print a char* the standard library tries to print a null terminated character string. As you only have a single character there is no null terminator so junk gets printed until the standard library happens to find a null byte, this is undefined behaviour.

To print a pointer rather than a string you need to cast to a different pointer type, for example:

char A4 = 'A';
cout << static_cast<void*>(&A4);

Upvotes: 3

Ulrich Eckhardt
Ulrich Eckhardt

Reputation: 17415

Check out the list of overloads for operator<< for streams. The one for char const* assumes a zero-terminated string at that address. What you want is the overload for void const*. For other types of pointees, that conversion is done implicitly by the compiler, for char you need to make it explicitly yourself:

cout << static_cast<void const*>(&b5) << endl;

Upvotes: 7

Related Questions