在 c 中使用动态分配输入字符串列表

input a list of strings using dynamic allocation in c

我正在尝试输入字符串列表。该列表的长度可能会有所不同,因此我尝试使用动态分配。每个字符串最多 20 个字符。该列表以一个点结尾。我已经研究了一段时间了,但我一直遇到分段错误,我不确定为什么。我想错误是在我使用 realloc / malloc 时,但我就是看不出我到底做错了什么。该代码块是一个更大程序的一部分,但我挑出了这个块并试图让它工作。它适用于一个单词后跟一个点的 "list"。一旦我尝试读取包含两个或更多字符串的列表,就会出现分段错误。 任何帮助都会很棒,谢谢!

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

char **resizeDynamicArray(char **arr, int newSize){
  char **ptr = realloc(arr, newSize*sizeof(char*)); 
  if (ptr==NULL) {
    printf("Error: memory allocation failed.\n"); 
    exit(-1); 
  }
  return ptr; 
}

int input (char ***seq){
  int len = 0; 
  char string[21]; 
  *seq=NULL;

  do{
    scanf("%s", string); 
    if (string[0] != '.'){
      *seq = resizeDynamicArray(*seq, (len+1)); 
      *seq[len] = malloc(sizeof(char[21]));
      strcpy((*seq)[len], string); 
      len++; 
    }
  } while (string[0] != '.');
  return len; 
}

int main(int argc, char *argv[]) {
  int length;
  char **words; 

  length = input(&words); 
  for (int i=0; i<length; ++i){
    printf("%s\n", words[i]); 
  } 
  for (int i=0; i<length; ++i){
    free(words[i]); 
  }  
  free(words); 
  return 0;
}

更改以下行:

*seq[len] = malloc(sizeof(char[21]));

至:

(*seq)[len] = malloc(sizeof(char[21]));

在索引到顶级数组之前,需要取消引用一个额外的间接级别。