-1

仲間。fopen の戻り値は、次の 2 つの点で異なることがわかりました。

1.
int main()
{
    FILE* fp_file = NULL;
    fp_file = fopen(file_path, "wb"); 
    if(NULL == fp_file) 
      return RET_NULL_POINT; 
    else
      return RET_OK;
}

2.
int _open_file(const char* ps_file_path, const char* ps_open_mode, FILE* fp_arg)
{
    if(NULL == ps_file_path || NULL == ps_open_mode)
    { return RET_INV_ARG;}

    fp_arg = fopen(ps_file_path, ps_open_mode); 
    if(NULL == fp_arg)
    { return RET_NULL_POINT;} 
    else
    { return RET_OK;}// fp_arg is NULL after fopen, but it return RET_OK, why?
}

int main()
{
    FILE* fp_file = NULL;
    int i4_ret = 0;

    i4_ret = _open_file((const char*)file_path, "wb", fp_file);
    if(RET_OK != i4_ret)
    {// do sth NG}
    else
    {// do sth OK}

    ......//NULL_POINT exception will be caused at some place below.
}

2) の file_path は 1) と同じです。1) の結果は RET_OK を返し、2) の i4_ret の結果は RET_OK ですが、fp_file は NULL です。1) の fp_file が正しい値なのに、2) では NULL になっている理由を知りたいのですが? 1) と 2) で fopen の引数に違いはありません。

4

4 に答える 4

3

これは、関数に渡されるパラメーターがコピーされるためです (この場合、ポインターがコピーされます)。だからあなたが呼び出すとき:

_open_file((const char*)file_path, "wb", fp_file);

関数_open_fileはポインタのコピーを取得しているfp_fileため、ポインタのコピーは呼び出された関数で更新されますが、ポインタは更新されませんmain

変数を値渡しおよび参照渡しする方法の詳細については、このスレッドを参照してください。

于 2013-07-09T14:49:42.663 に答える
0
FILE* fp_file = NULL;
...
i4_ret = _open_file((const char*)file_path, "wb", fp_file);
             ...
             fp_arg = fopen(ps_file_path, ps_open_mode);

fp_file 参照は、値として関数 _open_file に送信されると見なされます。_open_file 関数で参照する fp_file を変更しようとしても、関数を終了すると変更が保持されません。

関数にパラメーターとしてポインターを送信した場合でも、その関数では、その参照が指すメモリ領域の内容を変更せず、参照自体を変更します。これは、_open_file 関数でローカル変数としてコピーされ、ローカルでのみ変更されます。

参照を変更できるようにするには、関数への引数として FILE 参照への参照を送信する必要があります。

FILE* fp_file = NULL;
...
i4_ret = _open_file((const char*)file_path, "wb", &fp_file);
             ...
             *fp_arg = fopen(ps_file_path, ps_open_mode); 
于 2013-07-09T14:51:33.830 に答える
0

関数にFILE*名前fp_fileがありますmain()。を呼び出すと_open_file()、このポインターがパラメーターとして渡され、関数内のローカル変数fp_argに格納されます。

次に、関数はこのfp_arg変数を変更して、 によって返される新しいポインタを含めますfopen()

fp_fileinは、変数main()に対するこれらの変更の影響を受けません。が戻ってきfp_argたとき、まだ最初と同じ状態です。_open_file()fp_file

于 2013-07-09T14:51:52.157 に答える
0

うまく_open_file()機能しfp_arg = fopen(...)ますが、引数変数に別のポインターを割り当てfp_arg、それは返されません。を関数に渡しintてそこで変更した場合と同じです。の署名者を_open_file()に変更

int _open_file(const char* ps_file_path, const char* ps_open_mode, FILE** fp_arg)

fp_arg の値を設定します

*fp_arg = fopen()

そして電話する

i4_ret = _open_file((const char*)file_path, "wb", &fp_file);
于 2013-07-09T14:52:33.907 に答える