再谈高质量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也就是答案所说的野指针了。
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也就是答案所说的野指针了。
相关文章推荐
- 高质量C++编程指南 》学习重点四
- 类中的常量(高质量C++编程指南--5.4 摘录)
- 读高质量C++编程指南总结1
- 高质量C++编程(一)防止头文件重复引用
- 高质量C++编程点滴(二)
- 高质量c++编程指南 读书笔记 第一章:文件结构
- 《 高质量C++编程指南 》学习重点五
- 高质量C++编程 测试题 ------向C++进路路标转贴
- 高质量C++编程_第6章_函数设计(2)
- 高质量C++编程指南学习笔记5-6章---thanks to林锐
- 高质量的C++编程指南总结(二):常量、函数设计
- 《 高质量C++编程指南 》学习重点六
- 高质量C,C++编程
- 高质量C++编程(三)常量
- 高质量C\C++编程
- 高质量C++编程(林锐)
- 高质量C++编程之(7.4指针参数是如何传递内存的?)
- 《 高质量C++编程指南 》学习重点七
- 高质量C++编程(四)函数设计(1)
- 高质量C,C++编程指南 知识点小结(一)