NEWBIE:将指针传递给函数
NEWBIE: passing a pointer to a function
我正在尝试重新学习 C,而不是大约 5 年前涉足它。具体来说,我正在尝试学习如何从 main 中提取一些操作并将它们制作成一个函数,目的是将它们移动到接下来的库文件中。
这似乎有效:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
struct arguments {
char *word_file; /* Default name for input file */
} arguments;
int main (int argc, char *argv[]) {
arguments.word_file = "dummy";
FILE *fp;
fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
char word[60];
fgets (word, sizeof(word), fp);
printf("Word is %s\n", word);
}
顺便说一下,'dummy' 是:
$ cat dummy
dog
cat
$
无论我如何尝试,它要么给我编译错误,要么在我 运行 时出现段错误:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
struct arguments {
char *word_file; /* Default name for input file */
} arguments;
void getfile(FILE *fp) {
fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
}
int main (int argc, char *argv[]) {
arguments.word_file = "dummy";
FILE *fp;
getfile(fp);
char word[60];
fgets (word, sizeof(word), fp);
printf("Word is %s\n", word);
}
我试过从 *fp 到 fp 再到 &fp 但没有成功。关于文件指针,我确定有一些我不了解但无法弄清楚的地方。
感谢您的帮助和建议。
-凯文
fp
不应该是 getfile()
的参数,它应该是 return 值。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
struct arguments {
char *word_file; /* Default name for input file */
} arguments;
FILE *getfile() {
FILE *fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
return fp;
}
int main (int argc, char *argv[]) {
arguments.word_file = "dummy";
FILE *file_ptr;
file_ptr = getfile();
char word[60];
fgets (word, sizeof(word), file_ptr);
printf("Word is %s\n", word);
}
如果出于某种原因您确实需要将其作为参数传递,请参阅 Changing address contained by pointer using function
你有两个选择
首先,'getfile' return 文件句柄(这是 c 中最惯用的方式)
FILE *getfile() {
FILE *fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
return fp;
}
并在主要部分
FILE *fp = getfile(fp);
或使用 c-style 'pass by reference'
让 getfile 基于 更新 fp 值
void getfile(FILE **fp) {
*fp = fopen(arguments.word_file, "r");
if (*fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
}
主要
File *fp = NULL;
getfile(&fp);
问题是指针fp
按值传递给了函数getfile
。
getfile(fp);
即函数处理传递的指针值的副本fp
。所以改变函数中的副本并不会反映原始指针的值。
您需要通过引用传递指针。
在 C 中,按引用传递意味着通过指向对象的指针间接传递对象。取消引用指针,您可以直接访问原始对象。
所以像这样声明和定义函数
void getfile(FILE **fp) {
*fp = fopen(arguments.word_file, "r");
if ( *fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
}
并像
那样调用函数
getfile(&fp);
我正在尝试重新学习 C,而不是大约 5 年前涉足它。具体来说,我正在尝试学习如何从 main 中提取一些操作并将它们制作成一个函数,目的是将它们移动到接下来的库文件中。
这似乎有效:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
struct arguments {
char *word_file; /* Default name for input file */
} arguments;
int main (int argc, char *argv[]) {
arguments.word_file = "dummy";
FILE *fp;
fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
char word[60];
fgets (word, sizeof(word), fp);
printf("Word is %s\n", word);
}
顺便说一下,'dummy' 是:
$ cat dummy
dog
cat
$
无论我如何尝试,它要么给我编译错误,要么在我 运行 时出现段错误:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
struct arguments {
char *word_file; /* Default name for input file */
} arguments;
void getfile(FILE *fp) {
fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
}
int main (int argc, char *argv[]) {
arguments.word_file = "dummy";
FILE *fp;
getfile(fp);
char word[60];
fgets (word, sizeof(word), fp);
printf("Word is %s\n", word);
}
我试过从 *fp 到 fp 再到 &fp 但没有成功。关于文件指针,我确定有一些我不了解但无法弄清楚的地方。
感谢您的帮助和建议。
-凯文
fp
不应该是 getfile()
的参数,它应该是 return 值。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
struct arguments {
char *word_file; /* Default name for input file */
} arguments;
FILE *getfile() {
FILE *fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
return fp;
}
int main (int argc, char *argv[]) {
arguments.word_file = "dummy";
FILE *file_ptr;
file_ptr = getfile();
char word[60];
fgets (word, sizeof(word), file_ptr);
printf("Word is %s\n", word);
}
如果出于某种原因您确实需要将其作为参数传递,请参阅 Changing address contained by pointer using function
你有两个选择
首先,'getfile' return 文件句柄(这是 c 中最惯用的方式)
FILE *getfile() {
FILE *fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
return fp;
}
并在主要部分
FILE *fp = getfile(fp);
或使用 c-style 'pass by reference'
让 getfile 基于 更新 fp 值void getfile(FILE **fp) {
*fp = fopen(arguments.word_file, "r");
if (*fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
}
主要
File *fp = NULL;
getfile(&fp);
问题是指针fp
按值传递给了函数getfile
。
getfile(fp);
即函数处理传递的指针值的副本fp
。所以改变函数中的副本并不会反映原始指针的值。
您需要通过引用传递指针。
在 C 中,按引用传递意味着通过指向对象的指针间接传递对象。取消引用指针,您可以直接访问原始对象。
所以像这样声明和定义函数
void getfile(FILE **fp) {
*fp = fopen(arguments.word_file, "r");
if ( *fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
}
并像
那样调用函数getfile(&fp);