错误一:
一种错误的写法:
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没有影响。