为什么文件指针为空?

时间:2012-12-02 06:13:47

标签: c

在以下程序中,file_ptr为NULL,但正在正确初始化。为什么呢?

#include <stdio.h>
#include <stdlib.h>


void Fopen(const char * restrict filePath, const char * restrict mode, FILE * restrict filePtr);

int main(int argc, char ** argv)
{
    FILE * file_ptr = NULL;
    Fopen("dummy.dat", "r", file_ptr);
    printf("File pointer is %p\n", file_ptr);

    exit(0);
}

void Fopen(const char * restrict filePath, const char * restrict mode, FILE * restrict filePtr)
{
    if ( (filePtr = fopen(filePath, mode)) != NULL)
            printf("file pointer is %p\n", filePtr);
}

在命令行上:

[jim@cola c++]$ ./readFile
file pointer is 0x740010
File pointer is (nil)

唯一的解释是FILE *的副本正在传递给Fopen。我如何通过ref传递指针?

4 个答案:

答案 0 :(得分:6)

您的Fopen函数会更改其本地filePtr的值,然后将该值抛弃。代码中的任何内容都不能更改调用方中file_ptr的值。您只需将NULL传递给函数。

你想要这个:

FILE* Fopen(const char * restrict filePath, const char * restrict mode)
{
    FILE* filePtr;
    if ( (filePtr = fopen(filePath, mode)) != NULL)
            printf("file pointer is %p\n", filePtr);
    return filePtr;
}

答案 1 :(得分:3)

void Fopen(const char * restrict filePath, const char * restrict mode, FILE * restrict filePtr)

您正在第三个参数中传递指向FILE的指针,并且您在函数中更改了指针。你不能那样做。您必须改为传递此指针的地址。所以它看起来像(不要忘记改变身体):

void Fopen(const char * restrict filePath, const char * restrict mode, FILE ** restrict filePtr)

并致电:

Fopen("dummy.dat", "r", &file_ptr);

答案 2 :(得分:0)

在C函数中,参数按值传递。

FILE * file_ptr = NULL;
Fopen("dummy.dat", "r", file_ptr);

您只会将file_ptr的值传递给Fopen。要修改file_ptr对象,必须将指针传递给它。这意味着Fopen函数将具有FILE **参数。

答案 3 :(得分:0)

如果你使用c ++,你可以写

const char * restrict filePath

const char * & filePath

PS:关键字限制在c ++中不起作用