免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1779 | 回复: 5

[C] C语言问题 [复制链接]

论坛徽章:
0
发表于 2010-01-27 22:29 |显示全部楼层
typedef struct {
     int number;
     char *msg;
} unit_t;

void alloc_unit(unit_t **pp)
{
     unit_t *p = malloc(sizeof(unit_t));
     if(p == NULL) {
          printf("out of memory\n");
          exit(1);
     }
     p->number = 3;
     p->msg = malloc(20);
     strcpy(p->msg, "Hello World!");
     *pp = p;
}

有三个问题:
1,这里参数不能是unit_t *pp?
2.一般我们不是都直接可以 char *str  = "abcd"; 这样写吗,为什么这里的msg还要分配内存?
3.指针变量p不是出函数成野指针了,这样*pp不是也成野指针了?

麻烦高手给小弟解答下,谢谢!


问题1已经找到答案:
摘自林锐博士的书籍
如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例 7-4-1 中,
Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,
为什么?
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str 仍然为 NULL  
strcpy(str, "hello"); // 运行错误
}
毛病出在函数GetMemory 中。编译器总是要为函数的每个参数制作临时副本,指针
参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致
参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请
了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory
并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用
free释放内存。
如果非得要用指针参数去申请内存, 那么应该改用 “指向指针的指针” , 见示例 7-4-2。  
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // 注意参数是 &str,而不是str
strcpy(str, "hello");  
cout<< str << endl;
free(str);  
}

[ 本帖最后由 kris_fei 于 2010-1-28 22:38 编辑 ]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
发表于 2010-01-28 01:35 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2010-01-28 09:27 |显示全部楼层
我觉得程序还是有些问题的

既然传的参数是unit_t **pp,函数里面就直接可以
*pp= malloc(sizeof(unit_t));

如果写成现在这样,何不直接传参数unit_t *pp

而且我觉得这个代码有内存泄露嫌疑  有malloc  没看见free

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
发表于 2010-01-28 10:00 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2010-01-28 10:45 |显示全部楼层

回复 #4 pmerofc 的帖子

确实疏忽了函数调用是不能改变实参的值的

论坛徽章:
0
发表于 2010-01-28 22:44 |显示全部楼层
4楼说的很好,不过我还有其他两个问题不是很明白,望高手继续解答
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP