空指针如何改变其值?

Nff*_*ff3 1 c c++ pointers

我使用过这样的东西:

struct Node
{
    char name[50];
    Node *left,*right;
};

int main()
{
    char cmd[10];
    Node* p=NULL;

    scanf("%s",&cmd);

    if (p == NULL)
    {
        // do something

        // THIS NEVER GETS EXECUTED
        // WHYYYYY????
        //THIS IS STRANGE
    }
}
Run Code Online (Sandbox Code Playgroud)

所以基本上,p在我读入cmd变量后,指针会改变它的值.我试图注释掉scanf代码,然后一切正常.很奇怪.

eya*_*alm 8

你有缓冲区溢出.

内存看起来像这样:

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
 ^                             ^
 cmd[10]                       p 
Run Code Online (Sandbox Code Playgroud)

如果scanf读取超过10个字节,它将溢出到p.任何非零值都将使NULL检查失败,即使它不是有效指针.