空指针如何改变其值?

时间:2017-04-02 19:04:02

标签: 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
    }
}

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

1 个答案:

答案 0 :(得分:8)

你有缓冲区溢出。

内存看起来像这样:

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
 ^                             ^
 cmd[10]                       p 

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