【C语言】指针
错误一:
一种错误的写法:
int * x = (int *)malloc( * sizeof(int));
int * y = (int *)malloc( * sizeof(int)); y = x;
没有必要为y开辟内存,因为y在开辟内存时 y内存储的地址时开辟的内存的位置, 但是后面又把x的值赋给了y, y原本的内存值失去了控制。
而再 free(y); 时, free的其实是x开辟的内存,整个过程都失控了。
正确的写法是
int * x = (int *)malloc( * 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 = ; n2->parent = n1;
n2->left = NULL;
n2->right = n3;
n2->color = ; n3->parent = n2;
n3->left = NULL;
n3->right = NULL;
n3->color = ; 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没有影响。
【C语言】指针的更多相关文章
- C语言指针转换为intptr_t类型
1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...
- [转]C语言指针学习经验总结浅谈
指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...
- 不可或缺 Windows Native (7) - C 语言: 指针
[源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...
- C语言指针学习
C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...
- (转载)c语言指针学习
前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...
- 关于C语言指针的问题
在学习关于C语言指针的时候,发现这样一个问题,代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h&g ...
- C语言指针类型 强制转换
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...
- C语言指针和数组知识总结(上)
C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是: %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...
- C语言指针操作
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...
- C语言指针声明探秘
C语言指针声明探秘
随机推荐
- 什么是H标签?H1,H2,H3标签?以及和strong标签使用的方法及重要性
大家都知道,seo的一个很重要的一点就是要把网站做的条理清晰,让搜索引擎很容易的读明白,这个条理清晰不仅体现在网站的物理路径,url等地 方.在<h1><h2><h3&g ...
- OpenCV imread读取图片,imshow展示图片,出现cv:Exception at memory location异常
问题如上.环境:VS2013. 代码如下: #include "stdafx.h" #include "opencv2\opencv.hpp" using na ...
- Request.ServerVariables 参数大全
Request.ServerVariables("Url") 返回服务器地址 Request.ServerVariables("Path_Info") 客户端提 ...
- C++ 模拟虚拟键盘按键表
键盘VK键值列表 /* Virtual Keys, Standard Set*/ VK_LBUTTON 0x01 VK_RBU ...
- Javascript高级程序设计——函数声明与函数表达式的区别
在Javascript中,函数是Functioin类型的实例,所以函数也具备属性和方法,因为函数是对象,所以函数名自然就是指向对象的指针啦. 函数可以通过声明语法和表达式来定义: 声明:functio ...
- iOS开发——项目需求-快速回到当前界面的顶部
利用UIWindow实现快速到达顶部 如下图,在状态栏添加一个没有颜色的UIWindow(里面添加一个按钮),实现点击这个按钮时能快速的回到当前界面的顶部 核心代码 一.利用UIWindow实现到达顶 ...
- git 教程(4)--版本回退
现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下: Git is a distributed version control system. ...
- 关于mysql安全
修改root用户密码: update mysql.user set password=password('new_passwd') where user='root'; flush privilege ...
- django的views里面的request对象详解大全
简介 HTTP 应用的信息是通过 请求报文 和 响应报文 传递的,关于更多的相关知识,可以阅读<HTTP权威指南>获得. 其中 请求报文 由客户端发送,其中包含和许多的信息,而 djang ...
- 一个简单的log
#pragma once #include <windows.h> #include <process.h> class CLogger { public: static CR ...