Любимый наш C и приключения с памятью ( char , malloc, free). Программа на 20 строк вылетает

Здравствуйте, ответа на просторах интернета я так и не нашёл. В общем, абсолютно обычная ситуация: С помощью Malloc делаю матрицу char. И в будущем я хочу каждой строчке этой матрицы присваивать массив char ( слово, то есть). Получается, условно говоря, массив слов.

Проблема. Из-за printа или присваивания Слова ломается free( M [ i ] ), и у меня прога просто вылетает. Подскажите, как исправить)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int size_M = 250;
    char** M = (char**)malloc(size_M * sizeof(char*));

    for (int i = 0; i < size_M; i++)
    {
        M[i] = (char*)malloc(size_M * sizeof(char));
    }
    

    // вот с этого момента непонятки
    char a[] = "DDD";
    M[0] = a;
    printf("%s", M[0]);

    // очистка m[0] просто, чтобы проверить
    free(M[0]);

    free(M);
}

Ответы (1 шт):

Автор решения: Harry

Не

M[0] = a;

(это просто присваивание указателей, а не копирование), а

strcpy(M[0],a);

Своим присваиванием вы 1. создаете утечку памяти (адрес выделенной памяти теряется навсегда), а потом 2. пытаетесь освободить память из стека, в то время как free применимо только к памяти, выделенной через malloc.

→ Ссылка