-1

好朋友。我发现fopen的返回值通过以下两种方式不同:

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?fopen 的参数在 1) 和 2) 之间没有区别。

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_filemain()_open_file()fp_arg

然后该函数修改此fp_arg变量以包含由 . 返回的新指针fopen()

fp_fileinmain()不受这些变量更改的影响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 回答