| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1430 人关注过本帖, 1 人收藏
标题:[讨论]有关C中指针的一些需要注意的问题
只看楼主 加入收藏
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏(1)
 问题点数:0 回复次数:9 
[讨论]有关C中指针的一些需要注意的问题

请看下面几道题:
(1)void GetMemory(char *p)

{
p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str);

strcpy(str, "hello world");

printf(str);

}
请问运行Test函数会有什么样的结果?

(2)
char *GetMemory(void)
{

char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();

printf(str);

}
请问运行Test函数会有什么样的结果?

(3)
void GetMemory2(char **p, int num)

{

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello");

printf(str);

}

请问运行Test函数会有什么样的结果?

(4)
void Test(void)

{

char *str = (char *) malloc(100);

strcpy(str, “hello”);

free(str);

if(str != NULL)

{

strcpy(str, “world”);

printf(str);

}

}
请问运行Test函数会有什么样的结果?
大家看看,看看指针在使用过程中我们需要注意些什么




搜索更多相关主题的帖子: 指针 讨论 
2007-10-27 00:28
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
以下是引用静思在2007-10-27 0:28:58的发言:

请看下面几道题:
(1)void GetMemory(char *p)

{
p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str);

strcpy(str, "hello world");

printf(str);

}
请问运行Test函数会有什么样的结果?

(2)
char *GetMemory(void)
{

char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();

printf(str);

}
请问运行Test函数会有什么样的结果?

(3)
void GetMemory2(char **p, int num)

{

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello");

printf(str);

}

请问运行Test函数会有什么样的结果?

(4)
void Test(void)

{

char *str = (char *) malloc(100);

strcpy(str, hello);

free(str);

if(str != NULL)

{

strcpy(str, world);

printf(str);

}

}
请问运行Test函数会有什么样的结果?
大家看看,看看指针在使用过程中我们需要注意些什么




有几处输入错误
这四个都是很典型的错误啊
写的好^_^


[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-10-27 00:48
静夜思春
Rank: 1
等 级:新手上路
帖 子:137
专家分:0
注 册:2007-7-2
收藏
得分:0 
,这都行!
2007-10-27 02:59
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 
这些都是在使用指针作为函数的入口参数和返回参数应该注意的问题,不知道楼上的是什么意思


英者自知,雄者自胜
2007-10-27 12:39
crazyboy216
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2007-6-28
收藏
得分:0 

对第一个程序,我只想说 任何函数调用都是值调用. 通过p = (char *)malloc(100)而使变量p的值发生变化,但副本值的改变对str是没影响的,所以不能完成给str指针初始化.(PS: p在函数执行时是在栈里面的,而他所指向的地址却是在堆里面的,在函数GetMemory完后p被释放掉,但它所指向的内存还在,所以还会造成内存的泄露啊).

第二个程序,在GetMemory执行完时,虽然p的值是返回了,但p所指的内存以释放了,所以printf(str);show的值是无法预测的.

第四个程序,free(str)是释放掉str所指向的内存,而str就成为野指针,if(str != NULL)也就失效了,strcpy(str, “world”); 可能产生严重错误.

2007-10-27 17:49
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
咋没说第三个呢?
第三个错在没有free掉malloc申请的内存

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-10-27 18:02
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 

楼上的两位看来都清楚了,指针是个比较难懂的东西。
程序1:
程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。strcpy(str, "hello world");将使程序崩溃。

程序2:
可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。

程序3:
(1)能够输出hello
(2)内存泄漏
原因是申请的内存没被释放,内存泄露

程序4:
答:篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str成为野指针,if(str != NULL)语句不起作用,仍然执行if中的内容,修改动态内存中未知的部分。所以在free(str)之后为了以防万一得加上str=NULL






英者自知,雄者自胜
2007-10-27 18:58
hczsea
Rank: 2
等 级:论坛游民
帖 子:129
专家分:68
注 册:2007-10-23
收藏
得分:0 

学习,指针好难懂啊。还是少用为妙。

2007-10-31 10:59
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 
这东西怎么说呢,凡事有利就有弊。只要自己在使用指针时注意点,是能够给我们带来很多方便的

英者自知,雄者自胜
2007-10-31 11:04
chmlqw
Rank: 1
等 级:新手上路
帖 子:180
专家分:0
注 册:2007-10-11
收藏
得分:0 

原来在书上看见过,一直没有懂,今天终于懂点了
谢谢...

2007-10-31 12:58
快速回复:[讨论]有关C中指针的一些需要注意的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019549 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved