2015-07-08 2 views
1

Когда я скомпилировать этот код, как это, я получаю эту ошибку:Использование массива указателей?

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

Почему вы вызываете 'free (word_list)' сразу после того, как вы (попробуйте) выделите его? –

ответ

1

Вы объявили word_list как символьный указатель, а не массив же. Если ваш malloc предназначен для выделения пространства для одного из элементов массива, вам нужно сначала создать массив. (Строка с ошибкой выглядит так: Объявление переменная.)

Если вы знаете, насколько велик этот массив, вы должны быть настроены. Но если вы этого не сделаете, вы можете посмотреть, как работает realloc.

+0

Я просто предполагаю использовать malloc – Flower

+0

malloc теперь вызывает ошибку. неверное преобразование из void * в char * – Flower

+1

@Flower, что ошибка указывает, что вы используете компилятор C++ вместо компилятора C (оба языка разные) –

2

Итак, если я правильно понимаю, вам нужен массив строк? (Обратите внимание, это просто массив указателей и вам все еще нужно таНос пространства для каждой отдельной строки)

So

char *word_list[NUM_STRINGS]; 
word_list[i] = malloc(strlen(word) + 1); 
strcpy(word_list[i], word); 

Но, похоже, все элементы в массиве будут иметь одинаковую длину? В этом случае вы можете просто использовать что-то вроде этого, без необходимости таНос или бесплатно:

char word_list[NUM_STRINGS][STRING_LENGTH+1]; 
strcpy(word_list[i], word); 

Если вы хотите, чтобы это цикл на неопределенное время, пока их вводимый пользователем, то вы не сможете выполнить это легко с массивом (только если вы заботитесь о том, чтобы они переходили через предел NUM_STRINGS). На мой взгляд, связанный список будет работать лучше.

Смежные вопросы