为什么FILE *不存储打开文件的地址

时间:2015-11-16 14:16:00

标签: c

#include <stdio.h>

FILE * Openfile(char *filename,char *mode, FILE *fp);

int main(){

    FILE *fp=NULL;
    char *filename = "simple_index.file";
    char *openmode = "w";

    printf("FP(before call function):%p\n", fp);
    FILE *newfp = Openfile(filename, openmode, fp);
    printf("FP(after call function): %p\nNEWFP: %p\n", fp, newfp);                  

    return 0;
}

FILE * Openfile(char *filename,char *mode, FILE *fp){
    printf((fp = fopen(filename, mode)) ? "Good opening %s file\n": "Error open %s file\n", filename);          
    return fp;

}

结果:

FP(before call function):0x0
Good opening simple_index.file file
FP(after call function): 0x0
NEWFP: 0x800bc7140

在使用函数打开调用Openfile()函数中的文件后,指向文件结构的指针不会存储打开文件的地址。

为什么FP在函数中使用后不保存状态?为什么需要回来保存?

3 个答案:

答案 0 :(得分:7)

这是因为C使用pass-by-value进行函数参数传递。

如果你想对从该函数本身作为函数参数传递的变量进行更改,你需要一个指向该变量的指针传递给函数并在函数内部,你可以修改指针和调用者指向的值,它将持续存在。

否则,要从被调用函数返回值,通常我们return该值并将其分配给调用函数中的变量。

答案 1 :(得分:5)

FILE *newfp = Openfile(filename, openmode, &fp); FILE * Openfile(char *filename,char *mode, FILE **fp){ printf((*fp = fopen(filename, mode)) ? "Good opening %s file\n": "Error open %s file\n", filename); return *fp; } 存储更新的指针,但要访问您需要提供指针的地址。

尝试:

*fp

现在newfp和{{1}}将打印相同的值

答案 2 :(得分:2)

将功能更改为:

FILE * Openfile(char *filename,char *mode, FILE **fpp){
    printf((*fpp = fopen(filename, mode)) ? "Good opening %s file\n": "Error open %s file\n", filename);          
    return *fpp;

}

然后像这样称呼它:

FILE *newfp = Openfile(filename, openmode, &fp);