2016-03-02 3 views
-1

Я хотел бы спросить, как я могу сделать абсолютно динамическое strcuture строк. Actualy Я использую динамический массив с выделением значений «MAX»лучший способ сделать динамическую структуру для строк?

Пример:

const enum { MAX_WORDS = 20, MAX_LENGHT_OF_WORD = 50 } 
... 
char **words 
words = (char*) malloc (MAX_LENGHT_OF_WORD + 1 * sizeof(char*)); 
for (i = 0; i < MAX_WORDS; i++) { 
    words[i] = (char*) malloc (MAX_LENGHT_OF_WORD + 1 *sizeof(char*)); 
} 

Должен ли я это сделать без constats как-то? Может быть, со связанными списками?

Спасибо

+1

Не таНос 'SizeOf (Char *)' 'для слов [я]': 'таНос SizeOf (char) ', который всегда равен 1. –

+1

Связанный список будет« абсолютно динамичным ». Массив связан своей верхней границей, если только вы не перераспределите. –

+0

@PaulOgilvie Спасибо, за советы. Я не знал о realloc. Я думаю, что связанный список будет лучшим решением для этого. – JaxCze

ответ

1

См Do I cast the result of malloc?

words = (char*) malloc (MAX_LENGHT_OF_WORD + 1 * sizeof(char*)); 
          ^^^^^ Does not seem right. 
     ^^^^^^^^^ Definitely wrong since type of words is char**. 

Вы можете использовать

words = malloc (MAX_WORDS * sizeof(char*)); 

А лучше и более идиоматических метод будет использовать:

words = malloc (MAX_WORDS * sizeof(*words)); 

и потом. ..

for (i = 0; i < MAX_WORDS; i++) { 
    words[i] = (char*) malloc (MAX_LENGHT_OF_WORD + 1 *sizeof(char*)); 
                  ^^^^ Wrong 
} 

Вам необходимо sizeof(char). Вы можете использовать

words[i] = malloc (MAX_LENGHT_OF_WORD + 1 * sizeof(*words[i])); 

С sizeof(char) является 1, можно упростить, что:

words[i] = malloc (MAX_LENGHT_OF_WORD + 1); 
+0

VS2015 не позволяет мне скомпилировать " malloc (MAX_WORDS * sizeof (char *)) "but" (char *) malloc (MAX_WORDS * sizeof (char *)) "кажется ОК. Даже он до сих пор абсолютно динамичен, он ограничен константой «max» ... – JaxCze

+3

Если вы компилируете файл как программу на C++, вам нужен явный приведение. –

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