您的位置:首页 > 编程语言 > C语言/C++

再谈高质量c++编程的例题

2010-07-26 11:58 169 查看
今天在网上看到一道求助的题目,是关于指针作为函数参数的问题,让我不由得再次想到了高质量c++编程的例题,这个题目在国内应该是相当有知名度,很多应聘的时候似乎都会看到它的身影,题目如下:

void GetMemory(char *p) {

p = (char *)malloc(100);

}

void Test(void) {

char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str);

}

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

答:程序崩溃。 因为 GetMemory 并不能传递动态内存, Test 函数中的 str 一直都是 NULL。 strcpy(str, "hello world");将使程序崩 溃。

虽然有答案,但是我觉得作者还是没有把内部的道理给说明白,导致很多人还是不得其义,这个题应该是四道题中最有代表型的,指针作为型参来传值,这个值会不会返回呢?答案是不会,因为函数p只是一个str的拷贝,也就是都指向相同地址的一个变量而已,所有p是p,str是str,只是他们指向的地址相同,所以在这里p也不过是个地地道道的值传递而已,不要被他的指针表象所迷惑。

char *GetMemory(void) {

char p[] = "hello world"; return p;

} void Test(void) {

char *str = NULL; str = GetMemory(); printf(str);

}

请问运行 Test 函数会有什么样的结果? 答:可能是乱码。 因为 GetMemory 返回的是指向“栈内存” 的指针,该指针的地址不是 NULL,但其原 现的内容已经被清除,新内容不可知。

第二题就更进步了一步,不再傻傻的值传递了,知道用返回值了,答案也写的比较清楚了,也就说这个地址是可以返回了,但是地址是在栈中的,所以呢不安全随时可能被覆盖就是这个意思。其实这道稍微修改一下就ok了,char
*p = (char *)malloc(12);
strcpy(p,
"hello world"),
return p;

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 函数会有什么样的结果? 答: (1)能够输出 hello (2)内存泄漏

第三题就更有意思了,
既用
了地址传递又用了堆中分配空间的办法,可以说是对这道题的一个答案的暗示吧,
这道题在最后加上
free(str);str=NULL;就完整了,但是显得很啰嗦了。

void Test(void) {

{

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

strcpy(str, “hello”);

free(str); if(str != NULL)

{

strcpy(str, “world”); printf(str);

}

}

请问运行 Test 函数会有什么样的结果? 答:篡改动态内存区的内容,后果难以预 料,非常危险。 因为 free(str);之后,str 成为野指针, if(str != NULL)语句不起作用。

这道显然跟前面三题不是一个意思了,这题也顺便说一下吧,
free(str);这个到底做了什么?如果你明白了这个,这道题也就没什么了,他到底干什么了呢,当然是释放了指针指向的地址空间,也比方说房子都被人拆除了,你还去那也没地方住了,所有str也就是答案所说的野指针了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: