在以下程序中,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传递指针?
答案 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 ++中不起作用