以下情况是否会出现内存异常???内详

linyd 2004-07-29 10:37:59
一、
void getmem(char * p)
{
p = (char *)malloc(100);
}
void main()
{
char * str;
getmem(str);
strcpy(str,"hekk");
}
二、
char * getmem()
{
char *p="hello";
return p;
}
void main()
{
char * str;
str = getmem();
strcpy(str,"hekk");
}

以上两种情况会不会出现异常
...全文
131 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wigoo 2004-08-07
  • 打赏
  • 举报
回复
我认为这两个程序都可以运行,但

第一个存在内存泄漏,不过一次100byte,运行1000次也只泄漏100Kbyte而已;
第二个调用getmem()后,str指向的内存可能再次分配给其他变量,但在这个程序太小,这段内存没有机会再被分配了
linyd 2004-08-02
  • 打赏
  • 举报
回复
第二个程序到底是因为向静态存贮区写入内容导致出错,还是因为始终没有给指针分配空间啊
steel007 2004-07-30
  • 打赏
  • 举报
回复
来晚了,楼上的都说完了
第一个是Memory Leak
第二个会引起非法内存访问
Jarrylogin 2004-07-30
  • 打赏
  • 举报
回复
一 str没有初始化
// test11.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
char* getmem(char * p)
{
p = (char *)malloc(100);
return p;
}


int main(int argc, char* argv[])
{
char * str;
str=getmem(str);
strcpy(str,"hekk");
free(str);
return 0;
}
peter9606 2004-07-30
  • 打赏
  • 举报
回复
确切的说第一个运行完后没有任何问题,只是你的程序出现了内存泄漏

第二个程序,因为你始终没有给指针分配空间,没有分配空间的指真怎么能向里面拷贝东西呢?
所以这个会出错。
IDispatchwang 2004-07-30
  • 打赏
  • 举报
回复
两个都非法访问了:
1. str得知并不会在函数完成后改变。所以,str没有初始化的指针。并且,在函数种分配的内存,永远无法释放。
antijpn 2004-07-29
  • 打赏
  • 举报
回复
char * getmem()
{
char p[]="hello";
return p;
}
还是错的,这个是p的空间来自于函数的运行栈,只要函数结束,运行栈就被清空,所以p已经不复存在了,后面访问的其实是没有意义的空间,后面的程序一运行就会冲掉这些内容(或者后面有内容被strcpy冲掉)
antijpn 2004-07-29
  • 打赏
  • 举报
回复
全部异常,第一个是泄漏,只执行几次不要紧,多执行了以后就会内存全占满

第二个是向静态存贮区写入内容,一般情况下只要写入就非法操作了(有时候不出错,但是VC里面如果做了字符串常量优化的话,立刻就错)
linyd 2004-07-29
  • 打赏
  • 举报
回复
二写错了,改为
char * getmem()
{
char p[]="hello";
return p;
}

70,036

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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