读取c中的文件后,我的打印函数中出现Seg故障

读取c中的文件后,我的打印函数中出现Seg故障,c,segmentation-fault,C,Segmentation Fault,当我在main中调用print函数时,我的print函数中有一个未知的segfault,我看不出明显的修复方法是什么。我在整个程序中都使用了printf,但它不打印“here4”,这让我觉得这是由于我的print函数,或者当我在main中调用它时 我想将字典文件读入字符串数组 以下是代码片段: 如果您有任何想法,我们将不胜感激,谢谢 #define PRIME 1009 void fileRead(int argc, char **argv) void printTable(int a

当我在main中调用print函数时,我的print函数中有一个未知的segfault,我看不出明显的修复方法是什么。我在整个程序中都使用了printf,但它不打印“here4”,这让我觉得这是由于我的print函数,或者当我在main中调用它时

我想将字典文件读入字符串数组

以下是代码片段:

如果您有任何想法,我们将不胜感激,谢谢

#define PRIME 1009

void fileRead(int argc, char **argv)
    void printTable(int arrayLength, char **table); 

int main(int argc, char **argv)
{
    char **table;
    FILE *fp;
    int i, arrayLength = PRIME;

    /* Initial memory allocation */
    table = (char**)malloc(PRIME*sizeof(char));

    fileRead(argc, argv);
    printf("here3\n");
    for(i = 0; i < arrayLength; i++) {
        printTable(arrayLength,table); 
    }
    printf("here4\n");
    return 0;

}

void fileRead(int argc, char **argv)
{
    FILE *fp;
    char *word;
    int arrayLength = PRIME;

    word = calloc(MAXCHAR, sizeof(char));

    fp = fopen (argv[1], "r");
    printf("here1\n");
    /*read in grid and move along a cell each time */
    while (fscanf(fp, "%s", word)!= EOF) {
        if (argc != (2)) {
            fprintf(stderr, "Cannot open file, %s\n Try again e.g. %s dictionary.txt\n" , argv[1], argv[0]);
        }
        if(fp == NULL) {
            fprintf(stderr, "Cannot open file, %s\n Try again e.g. %s dictionary.txt\n" , argv[1], argv[0]);
            return;
        }
        if (fp == NULL) {
            fprintf(stderr, "Error opening file, try file name dictionary.txt\n");
            exit(EXIT_FAILURE);
        }
    } 
    printf("here2\n");
    fclose(fp);
    return;
}

void printTable(int arrayLength, char **table) 
{
    int i; 
    for(i = 0; i < arrayLength; i++) {  
        printf("%s\n", table[i]);
    }
    printf("\n");
}
#定义素数1009
无效文件读取(整型argc,字符**argv)
无效打印表(整数排列长度,字符**表);
int main(int argc,字符**argv)
{
字符**表;
文件*fp;
int i,排列长度=素数;
/*初始内存分配*/
表=(char**)malloc(PRIME*sizeof(char));
文件读取(argc、argv);
printf(“此处3\n”);
对于(i=0;i
让我总结一下您的代码:

  • 调用函数
    fileRead()
    • word
    • 读文件
    • 对读取的数据不执行任何操作
    • fileRead()
      没有任何用处:它不返回任何内容,不接触
      ,易受
      word
      缓冲区溢出的影响,并留下
      word
      的内存泄漏
  • 然后您将
    printf
    表的未更改和未初始化的内容

    • 让我总结一下您的代码:

      • 调用函数
        fileRead()
        • word
        • 读文件
        • 对读取的数据不执行任何操作
        • fileRead()
          没有任何用处:它不返回任何内容,不接触
          ,易受
          word
          缓冲区溢出的影响,并留下
          word
          的内存泄漏
      • 然后您将
        printf
        表的未更改和未初始化的内容
      试试这个

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      
      #define PRIME 1009
      #define MAXCHAR 256
      
      char **fileRead(FILE *fp, int *len);
      void printTable(int arrayLength, char **table); 
      
      int main(int argc, char **argv){
          if (argc != 2) {
              fprintf(stderr, "Need dictionary file argument.\nTry again e.g. %s dictionary.txt\n" , argv[0]);
              exit(EXIT_FAILURE);
          }
      
          FILE *fp = fopen (argv[1], "r");
          if(fp == NULL) {
              fprintf(stderr, "Cannot open file, %s\nTry again e.g. %s dictionary.txt\n" , argv[1], argv[0]);
              exit(EXIT_FAILURE);
          }
      
          int arrayLength = PRIME;
          char **table = fileRead(fp, &arrayLength);//fclose(fp) inside this
      
          printTable(arrayLength, table);
      
          for(int i = 0; i < arrayLength; ++i)
              free(table[i]);
          free(table);
      
          return 0;
      }
      
      char **fileRead(FILE *fp, int *len){
          char *word = calloc(MAXCHAR, sizeof(char));
          char **table = malloc(*len * sizeof(char*));
          int i = 0;
      
          while (i < *len && fscanf(fp, "%s", word) != EOF){
              table[i] = malloc(strlen(word)+1);
              strcpy(table[i++], word);
          }
          fclose(fp);
          *len = i;
          free(word);
      
          return table;
      }
      
      void printTable(int arrayLength, char **table){
          int i; 
          for(i = 0; i < arrayLength; i++) {  
              printf("%s\n", table[i]);
          }
          printf("\n");
      }
      
      #包括
      #包括
      #包括
      #定义素数1009
      #定义MAXCHAR 256
      字符**fileRead(文件*fp,int*len);
      无效打印表(整数排列长度,字符**表);
      int main(int argc,字符**argv){
      如果(argc!=2){
      fprintf(stderr,“需要字典文件参数。\n请重试,例如%s dictionary.txt\n”,argv[0]);
      退出(退出失败);
      }
      文件*fp=fopen(argv[1],“r”);
      如果(fp==NULL){
      fprintf(stderr,“无法打开文件,%s\n请再次尝试,例如%s dictionary.txt\n”,argv[1],argv[0]);
      退出(退出失败);
      }
      int arrayLength=素数;
      char**table=fileRead(fp,&arraylelength);//fclose(fp)在此文件中
      打印表格(排列长度,表格);
      对于(int i=0;i
      试试这个

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      
      #define PRIME 1009
      #define MAXCHAR 256
      
      char **fileRead(FILE *fp, int *len);
      void printTable(int arrayLength, char **table); 
      
      int main(int argc, char **argv){
          if (argc != 2) {
              fprintf(stderr, "Need dictionary file argument.\nTry again e.g. %s dictionary.txt\n" , argv[0]);
              exit(EXIT_FAILURE);
          }
      
          FILE *fp = fopen (argv[1], "r");
          if(fp == NULL) {
              fprintf(stderr, "Cannot open file, %s\nTry again e.g. %s dictionary.txt\n" , argv[1], argv[0]);
              exit(EXIT_FAILURE);
          }
      
          int arrayLength = PRIME;
          char **table = fileRead(fp, &arrayLength);//fclose(fp) inside this
      
          printTable(arrayLength, table);
      
          for(int i = 0; i < arrayLength; ++i)
              free(table[i]);
          free(table);
      
          return 0;
      }
      
      char **fileRead(FILE *fp, int *len){
          char *word = calloc(MAXCHAR, sizeof(char));
          char **table = malloc(*len * sizeof(char*));
          int i = 0;
      
          while (i < *len && fscanf(fp, "%s", word) != EOF){
              table[i] = malloc(strlen(word)+1);
              strcpy(table[i++], word);
          }
          fclose(fp);
          *len = i;
          free(word);
      
          return table;
      }
      
      void printTable(int arrayLength, char **table){
          int i; 
          for(i = 0; i < arrayLength; i++) {  
              printf("%s\n", table[i]);
          }
          printf("\n");
      }
      
      #包括
      #包括
      #包括
      #定义素数1009
      #定义MAXCHAR 256
      字符**fileRead(文件*fp,int*len);
      无效打印表(整数排列长度,字符**表);
      int main(int argc,字符**argv){
      如果(argc!=2){
      fprintf(stderr,“需要字典文件参数。\n请重试,例如%s dictionary.txt\n”,argv[0]);
      退出(退出失败);
      }
      文件*fp=fopen(argv[1],“r”);
      如果(fp==NULL){
      fprintf(stderr,“无法打开文件,%s\n请再次尝试,例如%s dictionary.txt\n”,argv[1],argv[0]);
      退出(退出失败);
      }
      int arrayLength=素数;
      char**table=fileRead(fp,&arraylelength);//fclose(fp)在此文件中
      打印表格(排列长度,表格);
      对于(int i=0;i1)
      table=(char**)malloc(PRIME*sizeof(char))-->
      table=(char**)malloc(PRIME*sizeof(char*)2)
      表[i]
      不存在