免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: madcola
打印 上一主题 下一主题

来挑挑错.容易犯的很阿. [复制链接]

论坛徽章:
0
31 [报告]
发表于 2005-04-13 18:20 |只看该作者

来挑挑错.容易犯的很阿.

原帖由 "benjiam" 发表:
#include <stdio.h>;
#include <stdlib.h>;
char * getMemory(char *p, unsigned int size)
{
p = (char*)malloc(sizeof(char) * size);
return p;
}
int main()
{
char *p = NULL;
p ..........


第二个程序在gcc+fedora2下编译运行仍然报段错误!!!

论坛徽章:
0
32 [报告]
发表于 2005-04-13 18:42 |只看该作者

来挑挑错.容易犯的很阿.

gdb调试到段错误时*p的值是0x0,好象是这个原因引起的。请高手指教

论坛徽章:
0
33 [报告]
发表于 2005-04-13 21:53 |只看该作者

来挑挑错.容易犯的很阿.

void getMemory(char **ppp, unsigned int size) ;

好象这样也不行吧,对于完成哪个任务而言!

论坛徽章:
0
34 [报告]
发表于 2005-04-14 00:11 |只看该作者

来挑挑错.容易犯的很阿.

闲着没事来看一眼,可实在是看不下去了。
#include <stdio.h>;
#include <stdlib.h>;
char * getMemory(char *p, unsigned int size)
{
p = (char*)malloc(sizeof(char) * size);
return p;
}
int main()
{
char *p = NULL;
p = getMemory(p,10);
strcpy(p,"hello";
printf("p==%s\n",p);
system("pause";
free(p);
return 0;
}

或者

#include <stdio.h>;
#include <stdlib.h>;
void getMemory(char **p, unsigned int size)
{
*p = (char*)malloc(sizeof(char) * size);

}
int main()
{
char **p ;
getMemory(p,10);
strcpy(*p,"hello";
printf("p==%s\n",*p);
system("pause";
free(*p);
return 0;
}

这是楼上一位兄弟的代码,有几个疑问讨论一下。
char * getMemory(char *p, unsigned int size) 这是什么用法?

其一、即然是获取内存,为什么还要传个指针?真是多此一举。
其二、即然是获取char *类型那么这个函数就没啥意义了直接用malloc就可以,虽然单独提供一个获取内存的函数很有必要,但是这个例子不好,给人感觉罗嗦。
建议规则:
type * get_type(void);
type为数据类型

char **p ;
getMemory(p,10);
大家看到了调用getMemory之前没有对p做任何赋值,所以程序运行时p的值是随机的,也就是说p指向了一段未知的区域,如果此时p的值是0于是下边的操作
*p = (char*)malloc(sizeof(char) * size);
便成了
*(char **)0 = (char*)malloc(sizeof(char) * size);  

这个结果我就不说什么了

另外楼上还有兄弟说在函数内用malloc分配的空间,在函数退出前会自动释放掉,这种说法是不对的(main函数除外)malloc分配的空间是在堆中分配的,只有在用户free或者main函数退出才会释放,系统不会自动释放此段内存。

建议:
指针是C的基础初学者一定要理解透彻,否则不要急于前进。

论坛徽章:
0
35 [报告]
发表于 2005-04-14 09:15 |只看该作者

来挑挑错.容易犯的很阿.

楼上的是高手,解释的真清楚。佩服!!!!

论坛徽章:
0
36 [报告]
发表于 2005-04-14 09:31 |只看该作者

来挑挑错.容易犯的很阿.

那么程序应该怎么改呢?是不是要对*p赋初值,谁能给出一个最后能运行的程序

论坛徽章:
0
37 [报告]
发表于 2005-04-14 12:01 |只看该作者

来挑挑错.容易犯的很阿.

#include <stdio.h>;
#include <stdlib.h>;
#include <string.h>;
                                                                                
void getMemory(char **p, unsigned int size)
{
        *p = (char*)malloc(sizeof(char) * size);
}
                                                                                
int main()
{
        char *p = NULL;
        getMemory(&p,10);
        strcpy(p,"hello";
        printf("p==%s\n",p);
        free(p);
        return 0;
}
或者#include <stdio.h>;
#include <stdlib.h>;
#include <string.h>;
char *getMemory(unsigned int size)
{
        char *p = (char*)malloc(sizeof(char)*size);
        return p;
}
                                                                                
int main()
{
        char *p = NULL;
        p = getMemory(10);
        strcpy(p,"hello";
        printf("p==%s\n",p);
        free(p);
        return 0;
}

论坛徽章:
0
38 [报告]
发表于 2005-04-14 15:28 |只看该作者

来挑挑错.容易犯的很阿.

呵呵,是啊,新手常犯的错误,而且造成了泄露,呵呵[/quote]

论坛徽章:
0
39 [报告]
发表于 2005-04-14 15:48 |只看该作者

来挑挑错.容易犯的很阿.

malloc 完了都不判断有没有分配成功?!岂有此理!

论坛徽章:
0
40 [报告]
发表于 2005-04-14 15:53 |只看该作者

来挑挑错.容易犯的很阿.

楼上批评得很对,应该改正!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP