Инициализация динамического массива структур в Си
Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Sentence {
char* chars;
};
struct Sentence get_sentence(char* chars){
struct Sentence s;
char sentence_chars[strlen(chars) + 1];
strcpy(sentence_chars, chars);
s.chars = sentence_chars;
return s;
}
int main() {
struct Sentence* sentences = malloc(sizeof(struct Sentence) * 5);
sentences[0] = get_sentence("hello");
sentences[1] = get_sentence("world");
printf("%s ", sentences[0].chars);
printf("%s", sentences[1].chars);
return 0;
}
На экран будут выведены одинаковые значения. Почему и как можно этого избежать?
Ответы (1 шт):
Автор решения: Maxim Timakov
→ Ссылка
Почему одинаковые?
Потому что вам так везло, что временная переменная char sentence_chars оказывалась по одному и тому же адресу.
Если бы между вызовами get_sentence были другие функции, то sentence_chars оказалась в другом месте, а значение из первого вызова затерлось мусором из стека.
Как избежать?
Выделяйте память с помощью calloc/malloc.
И не забывайте ее освобождать, используя free.