Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Printing value of pointer gives strange result

Tags:

c++

pointers

When I compile and run this C++ code, I am not getting the output I expected.

#include <iostream>
using namespace std;

int main()
{
    int * i = new int;
    long * l = new long;
    char * c = new char[100];
    float * f = new float[100];

    cout << "i " << i << endl;
    cout << "l " << l << endl;
    cout << "c " << c << endl;
    cout << "f " << f << endl;


    delete i;
    delete l;
    delete []c;
    delete []f;

    cin.get();
    return 0;
}

On a unix machine I get

i 0x967f008
l 0x967f018
c
f 0x967f090

On a windows machine the value for c prints as over a line of random characters.

Please can someone explain why it's not printing the pointer for the char array correctly.

Thanks

like image 663
Freddie Avatar asked Jun 22 '11 13:06

Freddie


Video Answer


3 Answers

operator << for std::ostream and std::wostream is defined in special way for char pointers(char*, const char*, wchar_t* and const wchar_t* to print out a null-terminated string. This enables you to write

const char* str = "Hello, World";
std::cout << str;

and see a nice string on your stdout.

To get the pointer value, cast to void *

std::cout << static_cast<void*>(c)
like image 53
Armen Tsirunyan Avatar answered Oct 06 '22 20:10

Armen Tsirunyan


The operator<< is overloaded for char*. It will consider that you are trying to print a C-style string, and print all the chars until it finds a 0x00. Since you're not initializing the allocated memory, it will print out random garbage.

like image 42
Mat Avatar answered Oct 06 '22 19:10

Mat


The char * is actually a C string. So I'm guessing it is trying to print it as a string.

One way to force the pointer address to be printed is to use printf:

printf("%p\n", c);
like image 32
FelixCQ Avatar answered Oct 06 '22 18:10

FelixCQ