Difference between dereferencing NULL pointer and uninitialised pointer

前端 未结 3 874
傲寒
傲寒 2020-12-22 14:01

On code blocks(C++)

#include
using namespace std;
int main(){
    int *p;
    cout<<*p;
}

produces garbage value

相关标签:
3条回答
  • 2020-12-22 14:47

    In the first code as we are not setting the pointer it is taking random value address... Which may have some garbage value. But in second case pointer is not pointing to any address so obviously it will fail

    0 讨论(0)
  • 2020-12-22 14:51

    Your first example,

    int *p;
    cout << *p;
    

    is taking a wild pointer and attempting to dereference it. What's at the other end of that pointer? Is it a system location that will cause a run time error? Is it the address of x, another variable in your program? Is it a piece of memory your web browser is using? Attempting to dereference and read or write to this location is undefined behavior, there's no guarantee of what will happen (time travel has been reported in extreme instances).

    Dereferencing a null pointer (a pointer to the 0 address) however, is also undefined, but will likely result in a segmentation fault--a run time error.

    0 讨论(0)
  • 2020-12-22 15:05

    Your expectation of a runtime error is flawed.

    Dereferencing an uninitialised/invalid pointer with arbitrary value can do anything at all.

    That means the potential symptoms range from:

    • nothing happens
    • something happens
    • a runtime error happens
    • your source code is spontaneously edited to use proper standard headers instead of misguidedly hacking in implementation "bits"
    • your attitude in the comments section is magically improved
    • your cat is murdered
    • your cat is not murdered
    • your cat is murdered and not murdered
    • your cat murders itself
    • a black hole opens inside your cat
    • a cat opens up inside a black hole

    and so on.

    This is true for dereferencing NULL, too, but modern commodity hardware tends to treat NULL dereferences specially, usually guaranteeing a segmentation fault to aid in diagnostics. Obviously, a CPU cannot do that for arbitrary pointer values, because they may be valid as far as it knows!

    0 讨论(0)
提交回复
热议问题