【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没有影响。

 

posted @ 2014-07-31 14:30  匡子语  阅读(206)  评论(0编辑  收藏  举报