导航
  • 全部
...

内存分配问题

yuanhong2910 2007-10-27 07:29:03
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
void f1(char *);
char* f2();
char* f3();
void f4(char **,int );
void f1(char * str){
str=(char *)malloc(100);
printf("%p\n",str);
}
char *f2(){
char str[]="abc";
return str;
}
char *f3(){
char *str="abc";
return str;
}
void f4(char **p,int m)
{
*p=(char *)malloc(m);
}
int main(){
char *a=NULL;
//f1(a); //为什么这里程序会崩溃
//a=f2();//为什么这里会输出乱码
//a=f3(); //这个和下面那个为什么能正确输出字符串
f4(&a,100);
strcpy(a,"Hello");
printf(a);
return 0;
}


另还有一个程序
int main()
{
char *str=NULL;
str=(char *)malloc(100);
free(str);
if(str!=NULL){
strcpy(str,"Hello");
printf(str);
}
return 0;
}为什么这个程序能正确执行
...全文
给本帖投票
225 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
独孤过儿 2007-10-28
  • 打赏
  • 举报
回复
你们是组团来问问题的还是不用自己帐号,而是用马甲出来问问题啊?
xlbdan 2007-10-28
  • 打赏
  • 举报
回复
已经free掉str的内存了,往里strcpy是必然错误的
admeng1986 2007-10-27
  • 打赏
  • 举报
回复
5楼XIAO LU?哈哈
XIAO LU 误解了2楼的意思
2楼说的是对的
yuanhong2910 2007-10-27
  • 打赏
  • 举报
回复
尴尬了,楼上的不要泄露隐私好不?还有楼上的楼上,admeng
Vishengsu 2007-10-27
  • 打赏
  • 举报
回复
第二个程序:
int main()
{
char *str=NULL;
str=(char *)malloc(100);
free(str);
if(str!=NULL){
strcpy(str,"Hello");
printf(str);
}
return 0;
}
free函数只是将str所指的内存填充垃圾数据,str还是原来的数据,if(str!=NULL)所以这句没有起到作用,这句strcpy(str,"Hello"); 执行不会有错误。
另外:我认为即使再次运行也不会有错误,因为str指向的是原来的内存位置,并不是任何地方
PS:楼主是LIWANGHONG BA?
admeng1986 2007-10-27
  • 打赏
  • 举报
回复
小红......
wild_fox86116 2007-10-27
  • 打赏
  • 举报
回复
搞定
xlbdan 2007-10-27
  • 打赏
  • 举报
回复
第一个程序楼上说的很清楚了,.

第二个程序:
int main()
{
char *str=NULL;
str=(char *)malloc(100);
free(str);
if(str!=NULL){
strcpy(str,"Hello");
printf(str);
}
return 0;
}

是一个错误的程序,if(str!=NULL)这句意在当str为空时,就不向其中拷贝字符串"hello".但实际上起不到这个作用.
这是因为在它上面的一句free(str)之后,str并不一定就是指向空的,而是一个野指针,可以指向任何地方,故向其中拷贝
数据是有错误的.而楼主运行没有发生错误,并不代表没有错误,当你再次使用到这块内存时,错误必将发生
ckt 2007-10-27
  • 打赏
  • 举报
回复
f1()是对a的副本进行操作,a本身并没有被修改
f2()是返回局部变量的指针赋值给a
f3()返回的是常量字符串的指针,你并不能对其进行写操作,
f4()是传递a的地址作为参数,malloc一段缓存并返回赋值给a

只有调用f4(),在进行strcpy(a,"Hello");才是合法的.


另一个程序也是不错误的操作。

65,179

社区成员

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

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

手机看
关注公众号

关注公众号

客服 返回
顶部