【问题标题】:A bug on pointer in CC中指针的错误
【发布时间】:2017-11-26 17:35:02
【问题描述】:

当我遇到这个问题时,我正在尝试编写二进制排序树: 指针有时不为 NULL。 本题中node2的left-child为NULL。但是当指针与NULL比较时,结果显示不是NULL。

Visual Studio 2015 提出了一个突破: 引发异常:

read access violation.

T is 0xCDCDCDCD.

If applicable to this exception handler, the program can safely continue to run.

那么如何编写 if 语句以使显示可用。 谢谢。

#include <stdio.h>

#define TRUE 1
#define FALSE -1 
#define NULL 0 
typedef struct Node {
    int data;
    struct Node* lchild, *rchild;
}BNode, *BTree;

int Display(BTree T) {
    if (T != NULL  ) {
        Display(T->lchild);
        printf("%d",T->data);
        Display(T->rchild);
        return TRUE;
    }
    else if(NULL == T){
        return FALSE;
    }
}
int main() {
    BTree node2 = (BTree)malloc(sizeof(struct Node));
    BTree node5 = (BTree)malloc(sizeof(struct Node));
    BTree node7 = (BTree)malloc(sizeof(struct Node));
    BTree node6 = (BTree)malloc(sizeof(struct Node));
    BTree node9 = (BTree)malloc(sizeof(struct Node));
    node2->data = 2;
    node5->data = 5;
    node7->data = 7;
    node6->data = 6;
    node9->data = 9;
    node5->lchild = node2;
    node5->rchild = node7;
    node7->lchild = node6;
    node7->rchild = node9;

    BTree root = node5;
    Display(root);
    system("pause");
}

【问题讨论】:

    标签: c pointers data-structures binary-search-tree


    【解决方案1】:

    NULL 初始值初始化leftright 子节点。(如果没有为它们分配任何节点地址)。这将使您免于访问垃圾值。

    例如:

    node2->lchild = NULL;
    node2->rchild = NULL;
    

    在您的情况下,某些节点 lchildrchild 包含垃圾值。您正在将它们与NULL 进行比较。如果您认为当您创建结构的实例时,指针变量会被初始化为NULL,那么您就错了。

    【讨论】:

    • 谢谢,我觉得我学C太随便了:(,我应该换个学习方式,下次想出更有用的问题。
    【解决方案2】:

    每当您为列表或树创建节点时,总是将其下一个和上一个指针初始化为 NULL。因为当您创建一个新指针时,它包含一些非 NULL 的垃圾值,因此您需要先将该值初始化为 NULL。我已在下面修改了您的代码,请尝试以下操作:-

     int main() {
        BTree node2 = (BTree)malloc(sizeof(struct Node));
        BTree node5 = (BTree)malloc(sizeof(struct Node));
        BTree node7 = (BTree)malloc(sizeof(struct Node));
        BTree node6 = (BTree)malloc(sizeof(struct Node));
        BTree node9 = (BTree)malloc(sizeof(struct Node));
    
        node2->data = 2;
        node5->data = 5;
        node7->data = 7;
        node6->data = 6;
        node9->data = 9;        
    
        node2->lchild = NULL;
        node5->lchild = NULL;
        node7->lchild = NULL;
        node6->lchild = NULL;
        node9->lchild = NULL;
    
        node2->rchild = NULL;
        node5->rchild = NULL;
        node7->rchild = NULL;
        node6->rchild = NULL;
        node9->rchild = NULL;
    
        node5->lchild = node2;
        node5->rchild = node7;
        node7->lchild = node6;
        node7->rchild = node9;
    
        BTree root = node5;
        Display(root);
        system("pause");
    }
    

    【讨论】:

    • 谢谢!我已经知道我犯的错误,我认为这个问题有点愚蠢=_=。
    【解决方案3】:

    您最终创建了悬空指针或野指针。确保始终在您在程序中创建它们的位置初始化指针。

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多