帮我看看这个错误啊

yuio123465 2009-10-15 09:10:42
#include
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,"hello world");
}
int main( )
{
char *str=NULL;
getmemory(str);
printf("%s/n",str);
free(str);
return 0;
}
这个程序错在哪 啊
...全文
205 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
cutrain2009 2009-10-18
  • 打赏
  • 举报
回复
问题是你再主函数中的str只是一个指针;
没有存储空间
应该给他分配空间str=new char[100];
结尾记的delect []str释放空间;

或是直接定义char str[100];也可以
blood0708 2009-10-17
  • 打赏
  • 举报
回复
上面的朋友都没有指出问题的本质! 编译器的行为才是问题的本质! 我们来看看lz的代码究竟做了一些什么!
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,"hello world");
}
int main( )
{
char *str=NULL;
getmemory(str);
printf("%s/n",str);
free(str);
return 0;
}
等同于下面的代码,从本质上讲编译器也是这样翻译的!
int main( )
{
char *str=NULL;
char *p
p=str;
p=(char *) malloc(100);
strcpy(p,"hello world");
printf("%s/n",str);
free(str);
return 0;}
看看上面的代码,可以清楚的了解,实际上str的值并没有改变,“hello world”并没有附给p!还有更严重的问题就是内存的问题! str是静态分配的,系统自动回收内存,但是你居然free(str),你知道这个函数会干些什么吗?试图在内存栈中free,如果这个函数执行成功,那后果就是和系统崩溃那么的接近,当然编译器绝对不会让你执行成功的!(她脾气很坏,经常发牢骚,但是她的工作态度是很严谨的)
p实际上别分配了2次内存,一次是在栈中,这没有问题,系统会自动回收!第二次是在堆中,但是你又犯了一个致命的错误,你没有显示的free掉内存占用,你知道这样做的后果吗?每执行一次,内存就会少一块,你的机器会越来越慢,直至崩溃!但是,遗憾的是编辑器大妈不会抱怨,因为她脑子还没有那么好,也许编译器大妈的女儿(下一代编译器)能变得更聪明!这也就是蠕虫计算机病毒的工作原理!

至于你说下面的代码能够成功:
#include <stdio.h>
#include <string.h>
void getmemory(char *p)
{
//p=(char *) malloc(100);
strcpy(p,"hello world");
}
int main( )
{
char str[100];
getmemory(str);
printf("%s\n",str);
//free(str);
return 0;
}
自己分析吧!
所谓的传值,传引用(传址)我觉得是TM老美忽悠我们那,根本就不是丫那么回事,函数的作用就是封装一些代码,链接后正确执行而已!什么传值,传引用都是丫屁话,根本就没有这个概念!学计算机还是要到美国啊,毕竟是人家发明的嘛。
赵4老师 2009-10-16
  • 打赏
  • 举报
回复
在调试窗口里面打开汇编看一下不就什么都明白了吗?
liem 2009-10-16
  • 打赏
  • 举报
回复
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,"hello world");
}
根据C语言参数传递规则,经过调用函数后,p的指向不会改变。可以用返回指针的函数解决:


char * getmemory(void)
{
char *p=(char *)malloc(100);
strcpy(p,"hello,world");
return p;
}

这样在主函数中将调用改为赋值:
getmemory(str);
改为:
str = getmemory();
yuio123465 2009-10-16
  • 打赏
  • 举报
回复
str不是指针吗?在getmemory(str)里传的不是指针吗?
yuio123465 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steedhorse 的回复:]
参数传递是值传递,对形参的修改改变不了实参。所以getmemory(str);调用之后str仍为NULL。
如果想影印实参,在C++中可以使用指针引用,或者通过二级指针来间接达到目的。
[/Quote]
那就是说我把getmemory(str)改成getmemory(&str),就可以了吧
sunsibin129 2009-10-16
  • 打赏
  • 举报
回复
路过,学习一下!
hanqing2348 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chenxu2614 的回复:]
#include <stdio.h>
#include <string.h>
void getmemory(char *p)
{
//p=(char *) malloc(100);
strcpy(p,"hello world");
}
int main( )
{
char str[100];
getmemory(str);
printf("%s\n",str);
//free(str);
return 0;
}
[/Quote]
那为什么这个就行了呢 也没用二级指针呀 void getmemory(char *p)是值引用呀
qingmazhang 2009-10-16
  • 打赏
  • 举报
回复
顶一下!!!!
LAN_YT 2009-10-16
  • 打赏
  • 举报
回复
学习了!
金刚葫芦娃 2009-10-16
  • 打赏
  • 举报
回复



....
jkfbaidu 2009-10-16
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void getmemory(char *p)
{

strcpy(p,"hello world");
}
int main( )
{
char *str;
str=(char *) malloc(100);
getmemory(str);
printf("%s/n",str);
free(str);
return 0;
}
这样也可以,因为str表示的是所用内存的首地址,所以肯定要先分配内存再传递
jackyjkchen 2009-10-15
  • 打赏
  • 举报
回复
下面补充下,printf在 <stdio.h>头文件内,strcpy在 <cstring>头文件内,malloc和free在 <stdlib.h>头文件内。一下是二级指针实现

C和C++头文件还是不混用的好,不是有什么后果,完美性问题和态度问题
Tauren2614 2009-10-15
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
void getmemory(char *p)
{
//p=(char *) malloc(100);
strcpy(p,"hello world");
}
int main( )
{
char str[100];
getmemory(str);
printf("%s\n",str);
//free(str);
return 0;
}
cyxcw1 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steedhorse 的回复:]
参数传递是值传递,对形参的修改改变不了实参。所以getmemory(str);调用之后str仍为NULL。
如果想影印实参,在C++中可以使用指针引用,或者通过二级指针来间接达到目的。
[/Quote]
下面补充下,printf在<stdio.h>头文件内,strcpy在<cstring>头文件内,malloc和free在<stdlib.h>头文件内。一下是二级指针实现
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
void getmemory(char **p)
{
*p=(char *) malloc(100);
strcpy(*p,"hello world");
}
int main( )
{
char *str=NULL;
getmemory(&str);
printf("%s\n",str);
free(str);
return 0;
}
lufy_sun 2009-10-15
  • 打赏
  • 举报
回复
char *getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,"hello world");
return p;
}
__lhl__ 2009-10-15
  • 打赏
  • 举报
回复
你必须使用二级指针,这样写:
void getmemory(char **p)
{
*p=(char *) malloc(100);
strcpy(*p,"hello world");
}
Eveilei 2009-10-15
  • 打赏
  • 举报
回复
没头文件!
#include <stdio.h>
lsldd 2009-10-15
  • 打赏
  • 举报
回复
void getmemory(char *p)
注意p并不是传引用,而是传值。因此该函数没有对p做任何改写。
因此导致的问题是getmemory内内存泄漏。
晨星 2009-10-15
  • 打赏
  • 举报
回复
参数传递是值传递,对形参的修改改变不了实参。所以getmemory(str);调用之后str仍为NULL。
如果想影印实参,在C++中可以使用指针引用,或者通过二级指针来间接达到目的。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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