Arrays 使用指针数组的拼写检查程序

Arrays 使用指针数组的拼写检查程序,arrays,c,pointers,segmentation-fault,Arrays,C,Pointers,Segmentation Fault,我正在尝试创建一个拼写检查程序,该程序读取一个文件,该文件包含约3000个无序的3-4个字母单词,每个单词在一行上,按字母顺序排序,然后打印出来 我有一个正在使用的“标准”数组形式,array[][],但是我试图修改程序,使其仅使用指针。我认为,通过根据char的大小*文件的大小对数组进行mallock,程序将有足够的内存来正确执行,但是当我运行代码时,指向while循环,我会不断得到SEGV #include <stdio.h> #include <stdlib.h>

我正在尝试创建一个拼写检查程序,该程序读取一个文件,该文件包含约3000个无序的3-4个字母单词,每个单词在一行上,按字母顺序排序,然后打印出来

我有一个正在使用的“标准”数组形式,array[][],但是我试图修改程序,使其仅使用指针。我认为,通过根据char的大小*文件的大小对数组进行mallock,程序将有足够的内存来正确执行,但是当我运行代码时,指向while循环,我会不断得到SEGV

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void bubbleSortWordsArray(char **array, int wordCount, int arrSize);
void printWordsArray(char **array, int wordCount);
int numOfLines(FILE *filePoint);

int main(int argc, char **argv) {
   FILE *fp = fopen(argv[1], "r");
   int i = 0, size = numOfLines(fp);
   char **words = (char **)malloc(sizeof(char) * size);

   if (fp == NULL) {
      fprintf(stderr, "fopen failed");
      exit(EXIT_FAILURE);
   }
   while (fgets(words[i], size, fp)) {
      words[i][strlen(words[i]) - 1] = '\0';
      i++;
   }
   
   fclose(fp);

   bubbleSortWordsArray(words, i, size);
   printWordsArray(words, i);

   free(words);
   return (0);
}

void bubbleSortWordsArray(char **array, int wordCount, int arrSize)
{
   int c;
   int d;
   char *swap = (char *)malloc(sizeof(char) * arrSize);

   for (c = 0; c < (wordCount - 1); c++) {
      for (d = 0; d < (wordCount - c - 1); d++) {
         if (0 > strcmp(array[d], array[d + 1])) {
            strcpy(swap, array[d]);
            strcpy(array[d], array[d + 1]);
            strcpy(array[d + 1], swap);
         }
      }
   }
}

void printWordsArray(char **array, int wordCount)
{
   int i;

   printf("\n");
   for (i = 0; i < wordCount; i++) {
      printf("%s\n", array[i]);
   }
}

int numOfLines(FILE *filePoint) {
  int c, count;
  count = 0;
  for (;; ) {
    c = fgetc(filePoint);
    if (c == EOF)
      break;

    if (c == '\n')
      ++count;
  }
  rewind(filePoint);

  return count+1;
}
#包括
#包括
#包括
void bubbleSortWordsArray(字符**数组,整数字计数,整数arrSize);
void printWordsArray(字符**数组,整数字数);
整数行(文件*文件点);
int main(int argc,字符**argv){
文件*fp=fopen(argv[1],“r”);
int i=0,size=numOfLines(fp);
字符**字=(字符**)malloc(大小(字符)*大小);
如果(fp==NULL){
fprintf(标准,“fopen失败”);
退出(退出失败);
}
while(fgets(单词[i],大小,fp)){
单词[i][strlen(单词[i])-1]='\0';
i++;
}
fclose(fp);
bubbleSortWordsArray(单词、i、大小);
印刷文字(文字,i);
免费(字);
返回(0);
}
void bubbleSortWordsArray(字符**数组,整数字数,整数arrSize)
{
INTC;
int d;
char*swap=(char*)malloc(sizeof(char)*arrSize);
对于(c=0;c<(字数-1);c++){
对于(d=0;d<(字数-c-1);d++){
如果(0>strcmp(数组[d],数组[d+1])){
strcpy(交换,数组[d]);
strcpy(数组[d],数组[d+1]);
strcpy(数组[d+1],交换);
}
}
}
}
void printWordsArray(字符**数组,整数字数)
{
int i;
printf(“\n”);
对于(i=0;i
尝试以下方法:

char **words = (char **)malloc(sizeof(char*) * size);
for(i = 0; i < size; i++){
    words[i] = (char*)malloc(sizeof(char) * (someValue + 2));
}
char**words=(char**)malloc(sizeof(char*)*size);
对于(i=0;i
其中someValue将是单词的最大长度(如果只有3-4个字母的单词,则将其设为4)。将2添加到此someValue中,这样您还可以存储表示每个单词结尾的'\n''\0'。每个单词都将是一个新字符串

char **words = (char **)malloc(sizeof(char) * size);
首先,跳过强制转换并使用变量而不是类型。这样,您就可以避免使用
char
而不是
char*
创建的错误。请在此处阅读更多信息:

第二。这里所做的只是为一些指针分配空间,但指针并不指向任何地方。之后你需要这样的东西:

for(int i=0; i<size; i++) 
    words[i] = malloc(sizeof (*words[0]) * maxwordsize);

for(int i=0;i您需要
size
指针,但您只分配
size
字符。而且您从不为
字[i]分配任何内存
。另外:您可以在
numOfLines
中添加1,以防最后一行不是以
\n
结尾。我编辑了代码以反映您的建议,将for循环直接放在我的变量初始化下面。但是,现在我的“摘要”导致堆缓冲区溢出在我的终端中,指向我的while循环。@Davospike然后你需要进行一些调试。如果这是你第一次真正使用指针,我还建议从更简单的开始。我刚刚指出了最明显的缺陷。导致缓冲区溢出的一个原因可能是
maxwordsize
需要内存空间零终止符。如果每行中有3-4个字母单词,
单词[i]
必须至少为6个字节提供空间。4个字符+
'\n'
+
0
for(int i=0; i<size; i++) 
    words[i] = malloc(sizeof (*words[0]) * maxwordsize);