在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一种错误的写法: 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没有影响。
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论