• 【C语言】指针


    错误一:

    一种错误的写法:

    int * x = (int *)malloc(5 * sizeof(int));
    int * y = (int *)malloc(5 * sizeof(int));
    
    y = x;

    没有必要为y开辟内存,因为y在开辟内存时 y内存储的地址时开辟的内存的位置, 但是后面又把x的值赋给了y, y原本的内存值失去了控制。

    而再 free(y); 时, free的其实是x开辟的内存,整个过程都失控了。

    正确的写法是

    int * x = (int *)malloc(5 * sizeof(int));
    
    y = x;
    ...
    free(x);

    错误二:

     引用不能乱用。

    typedef struct RBNode
    {
        RBNode *parent, *left, *right; 
        DataType key;  
        int color; 
    }RBNode;
    
    
    void change(RBNode * &x)  //错的 不应该加引用
    {
         RBNode * y = x -> right;
         y -> parent = x->parent;
    }
    
    void main()
    {
            RBNode *n1 ,*n2,*n3;
        n1 = (RBNode *)malloc(sizeof(RBNode));
        n2 = (RBNode *)malloc(sizeof(RBNode));
        n3 = (RBNode *)malloc(sizeof(RBNode));
    
    
        n1->parent = NULL;
        n1->left = NULL;
        n1->right = n2;
        n1->color = 1;
    
        n2->parent = n1;
        n2->left = NULL;
        n2->right = n3;
        n2->color  = 2;
    
        n3->parent = n2;
        n3->left = NULL;
        n3->right = NULL;
        n3->color = 3;
    
            change(n1);
    
    }

    上面代码的原本目的是令n2的parent变成n1, n1不变。 但实现的效果是 n1 变为 NULL 了。

    原因在于引用:  由于引用 y->parent 完全等于 x 即 &y->parent == &x == &n1  即它们只是名字不一样罢了。 y->parent = x->parent 的写法就是 x = x->parent.  x变成NULL了。故出错。

    去掉引用后,结果就正确了。 因为没有引用时 x 只是 n1的一个副本 &x != &n1 != &y->parent。 y->parent = x->parent 只是y的parent指向了x的parent指向的位置,对n1没有影响。

  • 相关阅读:
    Python中正则表达式的巧妙使用
    Django的ORM常用查询操作总结(Django编程-3)
    Django的datetime.timedelta类(Django编程-2)
    Python面向对象静态方法,类方法,属性方法
    Python常用的内置函数
    InnoDB和MyISAM的区别
    python中字典和json的区别
    分布式代码管理系统GIT
    安装php扩展 ffmpeg-php
    把文件每隔三行合并成一行(awk之RS、ORS与FS、OFS)
  • 原文地址:https://www.cnblogs.com/dplearning/p/3880742.html
Copyright © 2020-2023  润新知