分享

来一道 C 面试题试试手?

 cntagu 2020-02-10

题目是这样的:

#include 'stdafx.h'#include <iostream>using namespace std;void GetMemory(char *p, int num){ p = (char *)malloc(sizeof(char) * num); //p = new char[num]; //C++当中}int _tmain(int argc, _TCHAR* argv[]){ char *str = NULL; GetMeory(str, 100); strcpy(str,'Hello'); cout << str << endl; return 0;}

问:程序能否达到目的:在GetMemory()中为main函数中的开辟空间,并将str指向这段空间?

分析:str是一个指针,指向NULL,形参p也是一个指针,初始也指向NULL,在GetMemory函数中,这个指针又指向了新开辟的空间。但是只是形参的指向改变了,实参str仍然指向NULL,并没有改变。因此,程序达不到题目的要求,而且运行时会出现错误,由于str一直指向NULL,执行strcop时,会出现错误,提示某某内存不能写入。

正确的方法应该采用双指针,程序如下:

#include 'stdafx.h'#include <iostream>using namespace std;void GetMeory(char **p, int num){ *p = (char *)malloc(sizeof(char) * num); //*p = new char[num]; //C++当中}int _tmain(int argc, _TCHAR* argv[]){ char *str = NULL; GetMeory(&str, 100); strcpy(str,'Hello'); cout << str << endl; return 0;}

分析:str是一个指针,指向NULL。而调用GetMemory函数时,传递的是str的地址,p是一个二级指针,*p是一个指针。因此,将str的地址赋给临时变量p,则*p就是指针str的值,改变*p的值就相当于改变str的值。因此这种方法能够得到题目要求的效果。

讲到这里,我们再拓展一下,其实还有另外一种方法,采用一级指针,让函数返回一个指针变量,指向新分配的内存,程序如下:

#include 'stdafx.h'#include <iostream>using namespace std;char * GetMeory2(char *p, int num){ p = (char *)malloc(sizeof(char) * num); //p = new char[num]; //C++当中 return p;}int _tmain(int argc, _TCHAR* argv[]){ char *str = NULL; str = GetMeory2(str, 100); strcpy(str,'Hello'); cout << str << endl; return 0;}

到这里就讲完了,但最后还要补充一点:万不得已,不要使用这么复杂的指针

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多