LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: colored

函数返回后,地址怎么变了

[复制链接]
发表于 2003-7-1 13:12:16 | 显示全部楼层
前一阵在一本书上看到了如下程序:

  1. #include <stdio.h>

  2. void
  3. my_fopen(FILE *fp, char *filename)
  4. {
  5.   if((fp = fopen(filename, "r")) == NULL){
  6.     fprintf(stderr, "%s cannot open\n", filename);
  7.     exit(-1);
  8.   }
  9. }

  10. int main()
  11. {
  12.   FILE *fp;
  13.   char *name = "aaa";

  14.   my_fopen(fp, name);

  15.   //......

  16.   exit(0);
  17. }
复制代码

说是用了包装函数my_fopen就可以避免每次打开文件都要写4行代码云云,
我一看就知道这家伙从来就没有运行过自己的程序,编译没错误,运行时读写fp时肯定会得到一个“段错误”。
 楼主| 发表于 2003-7-1 17:54:04 | 显示全部楼层
我明白了,谢谢大家!
现在改正如下:

  1. main()
  2. {
  3. .....
  4. max=sortnode(head);
  5. if(max!=head)//放到函数体外,调用该函数后判断
  6.         premax->next=max->next;
  7. .....
  8. }
复制代码
发表于 2003-7-1 23:27:24 | 显示全部楼层
最初由 libinary 发表
前一阵在一本书上看到了如下程序:

  1. #include <stdio.h>

  2. void
  3. my_fopen(FILE *fp, char *filename)
  4. {
  5.   if((fp = fopen(filename, "r")) == NULL){
  6.     fprintf(stderr, "%s cannot open\n", filename);
  7.     exit(-1);
  8.   }
  9. }

  10. int main()
  11. {
  12.   FILE *fp;
  13.   char *name = "aaa";

  14.   my_fopen(fp, name);

  15.   //......

  16.   exit(0);
  17. }
复制代码


很奇怪呀,main()函数中的fp怎么这初始化就使用,而且还把fp的初始化放到子程序中进行,怎么看都觉得别扭。一般我所见到的程序都是在main()函数中初始化的。然后再传递到子程序使用。
发表于 2003-7-2 00:24:57 | 显示全部楼层

其实还是那个问题

在林锐的<高质量C>里面那个例子程序

  1. void getmemory(char *m,int n)
  2. {
  3.     m=(char *) malloc(sizeof(char)*n);
  4. }
  5. int main()
  6. {
  7. char *p=NULL;
  8. getmemory(p,100);
  9. strcpy(p,"hello");
  10. }
复制代码

就是这个了.
libnary说的非常对,从编译角度看,其实没有什么地址传递这么一说,c里面只有值调用
,可怜我以前也是看了那些书,结果最近看了林锐的书以后,想了好久,才有些明白.
真是的,国内好多出书的人都非常的不负责任.
发表于 2003-7-2 06:03:27 | 显示全部楼层
真是的,这样的程序为什么不写成
char* getmemory(int n);

FILE* my_open(const char* filename);
呢?可见,程序人人会编,好坏各有不同。
发表于 2003-7-2 07:16:06 | 显示全部楼层

回复: 其实还是那个问题

最初由 direstrait 发表

libnary说的非常对,从编译角度看,其实没有什么地址传递这么一说,c里面只有值调用
,可怜我以前也是看了那些书,结果最近看了林锐的书以后,想了好久,才有些明白.
真是的,国内好多出书的人都非常的不负责任.

从传值的角度看,指针作为参数被传递到子函数时只是堆栈中的临时变量,一旦被重定向到其它地址,这种修改只是在子函数范围内有效。函数返回之后,指针还是原来的值。呵呵。。。
国内的书,不读也罢。
发表于 2003-7-2 11:12:45 | 显示全部楼层
建议大家用**pointer编几个程序.
这样就什么都明白了.
发表于 2003-9-18 11:05:59 | 显示全部楼层
出于要利用返回值的原因吧,函数返回int,可以对出错情况进行处理,当然了,只有一种出错,就不必了!
发表于 2004-4-26 20:17:10 | 显示全部楼层
楼主这段代码我看着恼火了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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