当我按原样编译此代码时,我收到此错误:
variable-sized object 'word_list' may not be initialized
char *word_list[i] = malloc(sizeof(char) * STRING_LENGTH );
我知道第13行我的变量word_list
只是一个指向字符的指针而且它导致了问题。我必须使用指针数组而不是它但我不确定如何正确地执行此操作。 word_list
变量应该是一个使用strcpy
将字符串复制到其中的数组。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STRING_LENGTH 20
#define MAX 30
int read_string(char string[], int n);
int compare(const void*a, const void*b);
int main(){
int i;
char* word_list;
char word[STRING_LENGTH + 1];
for (i = 0; ; i++){
printf("\nEnter a word.\n");
read_string(word, STRING_LENGTH);
if (word[0] == '\0')
break;
char *word_list[i] = malloc(sizeof(char) * STRING_LENGTH );
free(word_list);
strcpy(word_list[i], word);
}
int length = sizeof(word_list)/sizeof(char*);
int j;
for (j = 0; word_list[j] != '\0'; j++)
printf("%s\n", word_list[j]);
qsort(word,length, sizeof(char*), compare);
for (j = 0; word_list[j] != '\0'; j++)
printf("%s\n", word_list[j]);
return 0;
}
int compare(const void*element1, const void *element2){
const char *string1 = *(const char**)element1;
const char *string2 = *(const char**)element2;
return strcmp(string1,string2);
}
int read_string(char string[], int n){
int ch, i = 0;
while ((ch = getchar()) != '\n')
if (i < n)
string[i++] = ch;
string[i] = '\0';
return i;
}
答案 0 :(得分:2)
所以,如果我理解正确,你想要一个字符串数组? (注意这只是一个指针数组,你仍然需要为每个单独的字符串malloc空间)
所以
FooImpl
但是看起来你的数组中的所有元素都是相同的长度?在这种情况下,你可以使用这样的东西,而不需要malloc或free:
char *word_list[NUM_STRINGS];
word_list[i] = malloc(strlen(word) + 1);
strcpy(word_list[i], word);
如果您希望在用户输入时无限期地循环播放,那么您将无法通过数组轻松完成此操作(仅当您关心它们超过NUM_STRINGS限制时)。在我看来,链表会更好用。
答案 1 :(得分:1)
您将word_list
声明为字符指针,而不是相同的数组。如果您的malloc
旨在为数组的其中一个元素分配空间,则需要先创建数组。 (带错误的行看起来像是声明变量。)
如果你知道这个数组需要多大,你应该全部设置好。但是,如果你不这样做,你可能想看看realloc
的工作原理。