我的C代码遇到了一些麻烦,并决定在这里向大师们询问我做错了什么。
//
// Routines.c
//
#include <stdio.h>
#include <errno.h>
...
int OpenFile(FILE * fd, char * nm, char * md){
FILE *rc;
printf("nm = %s, md = %s\n", nm, md);
fd = fopen(nm, md);
printf("fd fopen... errno = %d\n", errno);
if ( fd == NULL ) {
*rc = errno;
printf("fopen %s -> rc = %d\n", nm, *rc);
return rc;
}
printf("fd not NULL !!!\nrc = %d e errno = %d\n", *rc, errno);
return 0;
}
...
int Generate (char * v) {
int rc = 0;
FILE *fd;
rc = OpenFile (fd, v, "w");
if ( rc ){
printf ("open file error. RC = %d", rc);
return rc;
}
if (fd == NULL){
printf ("fd NULL !!!\n");
return 1;
}
CloseFile(fd);
printf("Closed fd\n");
printf("Leaving Generate. RC = %d\n",rc);
return rc;
}
...
这个Routines.c是这样制作的:
gcc -Wall -g -O0 -pedantic -fPIC -c Routines.c -o Routines.o
=============================================== =================
//
// Caller.c
//
#include <stdio.h>
#include <string.h>
#include "Routines.h"
....
int main (int argc, char **argv) {
....
char * v = "msgs.txt";
....
Generate(v);
....
return 0;
}
这个Caller.c是这样制作的:
gcc -Wall -g -O0 -fno-stack-protector -fPIC -c Caller.c
gcc -Wall -g -O0 -fno-stack-protector -fPIC -o Caller Caller.o Routines.o
=============================================== =================
两个c文件都编译为零错误(也没有警告)。
- 执行 -
来自OpenFile()的消息(即文件已正确打开)
nm = msgs.txt,md = w fd fopen ... errno = 0 fd不是空!!! rc = 0 e errno = 0
来自OpenFile()的消息(这里发生了什么?)
fd NULL !!!
有人可以告诉我返回给Caller的文件处理程序发生了什么 as NULL,当它在文件打开的Routines上正确设置???
要解决我的问题,我必须这样做:
FILE * OpenFile(char * nm, char * md, int * rc){
fd = OpenFile (v, "w", &rc);
但是我想冷静下来,明白我到底发生了什么事。
提前谢谢(很多)。
答案 0 :(得分:3)
FILE * fd
中的 OpenFile()
是包含指向文件的指针的局部变量。您正在更改本地函数范围内的指针 - 这些信息都不会超出您的OpenFile()
函数。