Инициализация динамического массива структур в Си

Вот код:

#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.

→ Ссылка