LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2957|回复: 41

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

[复制链接]
发表于 2004-12-9 16:25:39 | 显示全部楼层 |阅读模式
#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);
}
发表于 2004-12-9 17:54:23 | 显示全部楼层

  1. #include<stdio.h>
  2. #include<malloc.h>

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

  8. int main(void)
  9. {
  10.         char *f;
  11.         foo(23,&f);
  12.         printf("%s\n",f);
  13. }
复制代码
 楼主| 发表于 2004-12-9 22:43:58 | 显示全部楼层
我也看到了网上有这种改正的,但是你能说明为什么要这么改正么?
发表于 2004-12-9 22:53:00 | 显示全部楼层
最初由 小锁 发表

  1. #include<stdio.h>
  2. #include<malloc.h>

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

  8. int main(void)
  9. {
  10.         char *f;
  11.         foo(23,&f);
  12.         printf("%s\n",f);
  13. }
复制代码

没看出什么错误,除了一点不是很好的地方:最后没有free(f),但这在这里不是必须的.
运行起来也出什么错误

看错了,以为这个只是首贴的重新排版 :!!
发表于 2004-12-10 11:08:00 | 显示全部楼层

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

在原程序上说明了
最初由 jeffshia 发表


  1. #include<stdio.h>
  2. #include<malloc.h>

  3. void foo(int a,char *b) /*  *b是不能讲malloc的指针数组返回给调用函数的,所以用**b */
  4. {
  5.      b = (char *)malloc(64); /* 这里就要改成 (*b) */
  6.      snprintf(b,"you are %d years old!\n",a); /* snprintf 的第2个参数应该是b的size,漏了*/
  7. }

  8. int main(void)
  9. {
  10.      char *f;
  11.      foo(23,f); /* 修改了foo的接口,所以传个f的指针过去,&f */
  12.      printf("%s\n",b); /* b在main函数中没有定义,应该是f */
  13. }
复制代码

发表于 2004-12-10 14:40:39 | 显示全部楼层
**b,建议写成char *b[],这样看起来一个指针数组多明了,呵呵
发表于 2004-12-10 14:42:24 | 显示全部楼层
楼上解释的好。
大上楼的,没有好好看程序吧!
呵呵
发表于 2004-12-10 17:58:12 | 显示全部楼层
写**b是习惯问题
 楼主| 发表于 2004-12-12 08:22:21 | 显示全部楼层
为什么说写**b是习惯问题呢?
发表于 2004-12-12 11:07:42 | 显示全部楼层
做个投票,看看程序员在这个问题上是怎么写就知道了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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