• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

【C语言】指针

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一种错误的写法:

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C语言学习(二)发布时间:2022-07-13
下一篇:
使用一个程序同时启动多个程序(c#)发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap