LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: jeffshia

一道c语言的改错题目,请大家考虑考虑

[复制链接]
 楼主| 发表于 2004-12-12 12:16:43 | 显示全部楼层
没有必要这么做吧,呵呵,我只是想说这么做是必须的了,没有其他的意思!
发表于 2004-12-12 13:58:35 | 显示全部楼层
void foo(int a,char *b)
{
b = (char *)malloc(64);
snprintf(b,"you are %d years old!\n",a);
}

int main(void)
{
char *f;
foo(23,f);
printf("%s\n",b);
}

错误1:没有检查malloc的返回值是否为NULL
错误2:main里的指针b没有申明
错误3:即便main里的指针b是笔误,改成f,但是f没有初始化,函数foo根本没有改变f的值.
发表于 2004-12-15 11:12:41 | 显示全部楼层

回复: 一道c语言的改错题目,请大家考虑考虑

最初由 jeffshia 发表
#include<stdio.h>
#include<malloc.h>

void foo(int a,char *b)
{
     b = (char *)malloc(64);
     snprintf(b,"you are %d years old!\n",a);
}

int main(void)
{
     char *f;
     foo(23,f);
     printf("%s\n",b);
}


从程序可知,作者本意为
void foo(int a, /* [out] */char *b)

但是考虑到指针的传递问题,应该为:
void foo(int a, char **b)
...
否则新分配的指针无法回传,回传得参数只是栈内引用(退出函数即被清除)
发表于 2004-12-15 11:26:25 | 显示全部楼层
最初由 lucifer 发表
写**b是习惯问题


呵呵,我就喜欢写成 **b。指针多爽,数组还是看着别扭
 楼主| 发表于 2004-12-18 21:01:46 | 显示全部楼层
但是考虑到指针的传递问题,应该为:
void foo(int a, char **b)
...
否则新分配的指针无法回传,回传得参数只是栈内引用(退出函数即被清除)

为什么两级指针就能回传了呢?
 楼主| 发表于 2004-12-18 21:03:03 | 显示全部楼层
意思是不是如果我要回传一个普通的变量的话,必须使用一个指针;
但是如果我要回传一个指针的话,就必须使用两级的指针?
我想应该是这样的了。
谢谢
发表于 2004-12-18 21:08:15 | 显示全部楼层
您已经理解了栈的概念,请以此为起点继续思考。
 楼主| 发表于 2004-12-18 21:17:07 | 显示全部楼层
这和栈有什么关系么?
请不啬赐教!
发表于 2004-12-19 13:52:31 | 显示全部楼层
自动变量是放在堆栈中的,所以。。。
发表于 2004-12-19 15:15:38 | 显示全部楼层
C 语言中实参变量和形参变量之间的数据传递是单向的“值传递”,指针变量作为函数参数也要遵循这一规则。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表