续上一篇文章,上一篇文章题目都很经典,这一篇也不例外。
一.返回类型为指针经典题目(下)
1.代码(第六题)
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); }
正确
在“return p”之前:
在调用GetMemory之后:
2.代码(第七题)
char *GetString(void) { char p[] = "hello world"; return p; // 编译器将提出警告 } void Test4(void) { char *str = NULL; str = GetString(); // str 的内容是垃圾 cout<< str << endl; }
不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡;
在“return p”之前:
在“return p”之后,栈已经被跟随子函数的停止而销毁,所以:
3.代码(第八题)
char *GetString2(void) { char *p = "hello world"; return p; } void Test5(void) { char *str = NULL; str = GetString2(); cout<< str << endl; }
函 数Test5运行虽然不会出错,但是函数GetString2的设计概念却是错误的。GetString2内的“hello world”是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用GetString2,它返回的始终是同一个“只读”的内存块。
在“return p”之前:
在“return p”之后:
4.代码(第九题)
void test(void) { char *p = (char *) malloc(100); strcpy(p, “hello”); free(p); // p 所指的内存被释放,但是p所指的地址仍然不变 … if(p != NULL) // 没有起到防错作用 { strcpy(p, “world”); // 出错 } }
在“free(p);”之前:
在“free(p);”之后:
即虽然“hello”所在的堆的100个空间已经被消除了,但是p的值还是0x10006000,是个野指针,不能使用。所以建议在free之后,添加以下代码:
p=NULL;
5.代码(第十题)
#include <stdio.h> int main(void) { char *p = "helloworld"; *p = 'T'; printf("p=%s\n", p); return 0; }
编译通过,但运行时“Segmentation fault (core dumped)”
Segmentation fault (core dumped)一般是对内存操作不当造成的,常见的有:
(1)数组超出范围。
(2)修改了只读内存。
这里因为p指向"helloworld",是字符常量,存放在只读数据段内,不能被修改。若将p指针改为数组,即正确。
完结!
十道经典面试题很经典,值得我们去琢磨深思。
大家加油。。。。。最近在做算法题目可以关注我,点个赞,有问题可以一起讨论。
拜~
2023.02.17
From:努力进大厂的新青年