zoukankan      html  css  js  c++  java
  • 【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没有影响。

  • 相关阅读:
    从坐标系图中理解“空间变换”
    Normal Map中的值, Tangent Space, 求算 Tangent 与 Binormal 与 TBN Matrix
    A Personal Understanding to Matrix Transformation in Graphics
    [转] 双数组前缀树
    [转] Hive简介
    [转] 远程访问服务器Jupyter Notebook的两种方法
    [转] LSTM中的pack和pad
    [转] Beam Search
    [转] linux提示符过长tips
    [转] batch normalization相关
  • 原文地址:https://www.cnblogs.com/dplearning/p/3880742.html
Copyright © 2011-2022 走看看