在 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]));
在索引到顶级数组之前,需要取消引用一个额外的间接级别。
我正在尝试输入字符串列表。该列表的长度可能会有所不同,因此我尝试使用动态分配。每个字符串最多 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]));
在索引到顶级数组之前,需要取消引用一个额外的间接级别。