2

在以下程序中,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

4 回答 4

7

您的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;
}
于 2012-12-02T06:15:56.290 回答
3
void Fopen(const char * restrict filePath, const char * restrict mode, FILE * restrict filePtr)

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

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

并致电:

Fopen("dummy.dat", "r", &file_ptr);
于 2012-12-02T06:17:29.363 回答
0

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

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

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

于 2012-12-02T06:16:37.840 回答
0

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

const char * restrict filePath作为

const char * & filePath

PS:关键字restrict在C++中不起作用

于 2012-12-02T07:07:50.017 回答