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);