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)

3番目の引数でFILEへのポインターを渡し、関数で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_ptrの値をに渡すだけです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 に答える