C++: Pointer not initialized but pointing to a variable -


int main()  {     int b = 10;     int* bpointer;     *bpointer = b;     cout << *bpointer << endl;     cout << bpointer; } 

first cout prints 10, second prints 0. how can pointer pointing 0 store value?

as other comments , answers have noted, using uninitialized pointer yields undefined behavior—so shouldn't that. however, seem understand that, you're still curious why see behavior you're observing...

since bpointer not declared volatile, compiler can assume *bpointer cannot change during function scope.

basically, compiler sees assignment

*bpointer = b; 

and optimizes line

cout << *bpointer << endl; 

into this

cout << 10 << endl; 

which can assume equivalent.

the compiler might able deduce program ends @ point, , skips assignment *bpointer altogether; however, seems bit more farfetched me.

all of platform , compiler combinations tried yielded error, wasn't able confirm explanation—but if you're observing behavior, that's educated guess happened.

update

i able reproduce behavior g++ (gcc) 4.8.3 when compiling -o1 flag. here's relevant assembly1:

main: .lfb975:         .cfi_startproc         subq    $8, %rsp         .cfi_def_cfa_offset 16         ; next 3 lines print "10" (via cout)         movl    $10, %esi         movl    std::cout, %edi         call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)         ; next 2 lines print `endl` (via cout)         movq    %rax, %rdi         call    std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)         ; next 3 lines print "0" (via cout)         movl    $0, %esi         movl    std::cout, %edi         call    std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_m_insert<void const*>(void const*)         movl    $0, %eax         addq    $8, %rsp         .cfi_def_cfa_offset 8         ret 

as can see, compiler got rid of both variables (i.e., neither b nor bpointer has corresponding memory location on stack), , instead assumes constant values (10 , 0), printed.

again, since using uninitialized pointer results in undefined behavior, compiler free whatever wants... think particular behavior bit strange, it's still "valid" since pointer uninitialized.


1if you're interested, assembly generated this: g++ -o1 test.cpp -s -o /dev/stdout | c++filt


Comments

Popular posts from this blog

java - nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet Hibernate+SpringMVC -

sql - Postgresql tables exists, but getting "relation does not exist" when querying -

asp.net mvc - breakpoint on javascript in CSHTML? -