编程小苑
C++博客
首页
新文章
新随笔
聚合
管理
posts - 19, comments - 21, trackbacks - 0
一个关于指针的问题
有些东西在你没有遇到之前还真是不知道自己没有弄清楚,也许是我平时细节的地方注意少了,看来以后要多加注意了。
char
*
pStr;
char
ch;
char
str[]
=
"
Hello
"
;
ch
=
str[
1
];
*
pStr
=
str[
1
];
printf(
"
ch = %c\n
"
, ch);
printf(
"
*pStr = %c
"
,
*
pStr);
此时打印ch值的时候能正确输出,但是打印pStr[0]的时候就出问题了,跟踪发现是pStr[0] = str[1];这句出现问题。
原来,char *pStr; 只定义了一个4字节的指针变量,而这个变量里面的内容是将要指向一个char类型变量的,但是此时pStr只是个“野指针”,并没有指向一个char类型的内存单元,所以,当用*pStr来访问这个元素时,系统根本不知道该访问何处的空间,因此,在使用pStr前,必须让它指向一个具体的空间。
由上面可以将相关语句改为
char
*
pStr;
char
ch;
char
str[]
=
"
Hello
"
;
pStr
=
&
ch;
//
pStr指向ch、获得初始化
pStr
=
&
str[
1
];
//
pStr指向str[1]地址、获得初始化
ch
=
str[
1
];
*
pStr
=
str[
1
];
printf(
"
ch = %c\n
"
, ch);
printf(
"
*pStr = %c
"
,
*
pStr);
也就是说,要先给指针一个地址值初始化它,然后才能用*访问它指向的内容。
◎另外,
在子函数中使用malloc()/new()分配的内存空间不会因子函数的返回而消失
,函数只会清理调子函数里定义的变量的空间,如:
char
*
func()
{
char
*
p;
p
=
(
char
*
)malloc(
sizeof
(
char
));
return
p;
}
//
返回后,p所在空间被释放,但是p所指空间还存在
所以,可以用p1=func();来获得在func()中分配的空间。
此中方法可以用来解决“指针的指针”使用不方便的问题。步骤分2步:1、把传入的指针的指针参数去掉;2、把函数的返回值赋给要改变的对象的指针:
void
GetMemory2(
char
**
p,
int
num)
{
*
p
=
(
char
*
)malloc(
sizeof
(
char
)
*
num);
}
void
Test2(
void
)
{
char
*
str
=
NULL;
GetMemory2(
&
str,
100
);
//
注意参数是 &str,而不是str
strcpy(str,
"
hello
"
);
cout
<<
str
<<
endl;
free(str);
}
/**/
//////
下面是用传递动态内存的方法实现
char
*
GetMemory3(
int
num)
{
char
*
p
=
(
char
*
)malloc(
sizeof
(
char
)
*
num);
return
p;
}
void
Test3(
void
)
{
char
*
str
=
NULL;
str
=
GetMemory3(
100
);
strcpy(str,
"
hello
"
);
cout
<<
str
<<
endl;
free(str);
}
因为此时用malloc/new分配的内存空间是堆里面的,函数返回时不会回收;而如果在子函数中用char p[]="asdfgewq";则p是在栈中定义的(先分配p的空间,然后讲字符串拷贝进去,跟char *p="asdfasdf"分配在全局静态内存中不一样),所以会被系统收回。
posted on 2005-12-21 10:55
halCode
阅读(551)
评论(0)
编辑
收藏
引用
所属分类:
算法/数据结构
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
一个关于指针的问题
数组和指针的比较
C++里"const"关键字相关问题
原码、反码、补码
终于弄清了几个长期模模糊糊的问题
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
<
2006年10月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(7)
给我留言
查看公开留言
查看私人留言
随笔分类
DirectShow
Qt编程(3)
VC/MFC(4)
算法/数据结构(5)
心情(6)
随笔档案
2008年7月 (1)
2006年4月 (1)
2006年3月 (4)
2006年2月 (1)
2005年12月 (6)
2005年11月 (6)
文章分类
VC/MFC(4)
备看文档(10)
驱动(1)
算法/数据结构(6)
心情(1)
文章档案
2006年9月 (1)
2006年5月 (2)
2006年2月 (1)
2006年1月 (4)
2005年12月 (5)
2005年11月 (7)
相册
程序相关
编程资源
http://dict.cnki.net/
infoxa的E书下载
很不错的书籍下载站,不用注册,书籍丰富
MSDN上DDK的教程
很难找到,所以保存起来
驱动开发网
驱动开发网
中国协议分析网
不务正业
IMG2TXT
IMG2TXT
MakePic
Make various funny Pics
我99伴奏
不错,全,而且质量还不错
找工作
经典招聘面试笔试题目集锦
招聘笔试题目交流
搜索
最新评论
1. re: 灰鸽子第二章:好马配好鞍,服务端正确配置
安装名改1.EXE 启动项那里也改1 不行就是不行!骗人的!
--LWJ
2. re: NSIS常见问题集锦
怎样屏蔽安装时候用户选择路径,我想自定义路径不让他选了,谢谢。
--zx
3. 大家一起学习
评论内容较长,点击标题查看
--zinikl
4. re: 原码、反码、补码
评论内容较长,点击标题查看
--sdgsdg
5. re: 一个老工程师的话(转载)
学习了
--小马
阅读排行榜
1. 原码、反码、补码(7026)
2. 用socket编写C/S结构程序的流程图(6303)
3. 关于qt支持中文、国际化 (5255)
4. MoveWindow(2876)
5. SetWindowPos(2699)
评论排行榜
1. 原码、反码、补码(2)
2. 一个老工程师的话(转载)(2)
3. 第一个Qt程序(1)
4. 对《Visual C++中为普通程序添加ODBC应用》的学习和认识(1)
5. 终于弄清了几个长期模模糊糊的问题(0)