一直没理解的面试题 求解答

zw1270644192 2011-08-23 09:21:38
一:
void GetMemory( char *p )
{
 p = (char *) malloc( 100 );
}

void Test( void )
{
 char *str = NULL;
 GetMemory( str );
 strcpy( str, "hello world" );
 printf( str );
}


 
二:
char *GetMemory( void )
{
 char p[] = "hello world";
 return p;
}

void Test( void )
{
 char *str = NULL;
 str = GetMemory();
 printf( str );
}


 
三:
void GetMemory( char **p, int num )
{
 *p = (char *) malloc( num );
}

void Test( void )
{
 char *str = NULL;
 GetMemory( &str, 100 );//应该加上是否申请成功
 strcpy( str, "hello" );
 printf( str );
}


四:
void Test( void )
{
 char *str = (char *) malloc( 100 );
 strcpy( str, "hello" );
 free( str );
 ... //省略的其它语句
}

谁给说说这几个函数的内存问题到底是怎么回事
...全文
3139 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjx8613 2011-09-05
  • 打赏
  • 举报
回复
学习了
sandunfandeshijie 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 deping_chen 的回复:]

第一个:内存泄漏,程序崩溃[因为向0地址写数据]。
第二个:内存没问题,程序崩溃[因为向只读内存写数据]。
第三个:内存泄漏了,应该free掉分配的内存。
第四个:OK,如果一定要挑毛病,那么应该检查是否分配成功。
[/Quote]

第二个不是只读内存

只读内存的会写成: char *p = "Hello World";

char p[] = "Hello World"是正常的数组初始化。其他的就不说了,自己可以试试p内容的地址是不是在栈区
VeryShooter 2011-08-27
  • 打赏
  • 举报
回复
TomByTed 2011-08-27
  • 打赏
  • 举报
回复
似乎面试这题很少见了吧!
leezhu_029 2011-08-26
  • 打赏
  • 举报
回复
汇编加计算机组成原理 以前我们把文字写在纸上 然后放在自己找的到得地方 现在 科技发达了 把任何信息变成二进制放在内存里面 然后给出首地址。
willak47 2011-08-25
  • 打赏
  • 举报
回复
第一个不对的,可以修改为指针的应用就可以了。。
maoshuangxi 2011-08-25
  • 打赏
  • 举报
回复
飘过
wqOoops 2011-08-25
  • 打赏
  • 举报
回复
看看C语言程序设计·现代方法(第二版),很好的一本书...
我在地球 2011-08-25
  • 打赏
  • 举报
回复
淘气郎,上学堂
deping_chen 2011-08-25
  • 打赏
  • 举报
回复
第一个:内存泄漏,程序崩溃[因为向0地址写数据]。
第二个:内存没问题,程序崩溃[因为向只读内存写数据]。
第三个:内存泄漏了,应该free掉分配的内存。
第四个:OK,如果一定要挑毛病,那么应该检查是否分配成功。
deepdeeper 2011-08-24
  • 打赏
  • 举报
回复
mark一下
wuchao19881003 2011-08-24
  • 打赏
  • 举报
回复
晕死,评完发现这么多人说指针引用,呵呵
wuchao19881003 2011-08-24
  • 打赏
  • 举报
回复
还有种方法,指针引用也不错
至善者善之敌 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jxiaoshen 的回复:]
1 GetMemory 并不能传递动态内存,Test 函数中的str 一直都是NULL。strcpy(str, "hello world");将使程序崩溃。

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

3(1)能够输出hello(2)内存泄漏

4 篡改动态内存区的内容,后果难以预料,非常危险。因为fr……
[/Quote]

+++1
Jxiaoshen 2011-08-23
  • 打赏
  • 举报
回复
1 GetMemory 并不能传递动态内存,Test 函数中的str 一直都是NULL。strcpy(str, "hello world");将使程序崩溃。

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

3(1)能够输出hello(2)内存泄漏

4 篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str 成为野指针,
if(str != NULL)语句不起作用。

高质量c++编程指南 写的很清楚 楼主找下看看

科比布莱恩特 2011-08-23
  • 打赏
  • 举报
回复
这三道题比较简单。


切忌不能传递没有意义的内存申请。
luciferisnotsatan 2011-08-23
  • 打赏
  • 举报
回复
http://blog.csdn.net/luciferisnotsatan/article/details/6308518
PG 2011-08-23
  • 打赏
  • 举报
回复
这些面试题经常出现了,都烂了。

楼主要熟悉下,指针到底是什么东西。熟悉这个的话,做这些题都是切菜。

《C专家编程》《C和指针》
hongwenjun 2011-08-23
  • 打赏
  • 举报
回复
一:
void GetMemory( char *p )
{
 p = (char *) malloc( 100 ); // 函数里分配内存,没有释放
}

void Test( void )
{
 char *str = NULL;
 GetMemory( str );
 strcpy( str, "hello world" );
 printf( str );
}


 
二:
char *GetMemory( void )
{
 char p[] = "hello world"; // 返回 局部变量 指针 指向的字符串
 return p; // 函数结束后就销毁了
}

void Test( void )
{
 char *str = NULL;
 str = GetMemory();
 printf( str );
}


 
三:
void GetMemory( char **p, int num )
{
 *p = (char *) malloc( num ); // 函数里分配内存,没有释放 //双指针就不清楚了
}

void Test( void )
{
 char *str = NULL;
 GetMemory( &str, 100 );//应该加上是否申请成功
 strcpy( str, "hello" );
 printf( str );
}


四:
void Test( void )
{
 char *str = (char *) malloc( 100 );
 strcpy( str, "hello" );
 free( str ); // 没有取出来用就销毁了
 ... //省略的其它语句
}



昨天晚上写一个函数,自己想到用一个 全局字符串组做缓冲,
避免了内存泄漏

const int SIZE = 1024 * 8;
char APPBUF[SIZE]; // 设置缓冲区 APPBUF
// 本函数完成从 分词里找最长的分词,使用缓冲区,避免了内存泄漏
char *search(const char* chbuf , const char* val)
{
char *ret = APPBUF; // 使用缓冲区,先清0
memset(ret, 0, SIZE);
char *pch = NULL;
char *funbuf = new char[strlen(chbuf)+1];
strcpy(funbuf, chbuf);


pch = strtok(funbuf, val);
while (pch != NULL) {
if (strlen(ret) < strlen(pch)) { // 获取最长的字符串单元
strcpy(ret, pch);
}
pch = strtok(NULL, val);
}
delete[] funbuf;
return ret;
}
xiaoguangzaia 2011-08-23
  • 打赏
  • 举报
回复
第一二个失败,第三四个成功

第一个必须传递指针的指针(像第三个)或指针的应用

第二个是临时变量,返回后就释放了
加载更多回复(8)

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧