使用指针数组?

时间:2015-07-08 18:07:20

标签: c arrays string pointers

当我按原样编译此代码时,我收到此错误:

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;
    }

2 个答案:

答案 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的工作原理。