Насколько я понимаю, у вас есть некоторые трудности в понимании разницы между массивом и динамической памятью.
Каждый раз, когда вы объявляете массив, например:
char array[10];
Вы выделяете 10 chars
(то есть большую часть времени 10 байтов) в стеке.
Но у программы есть не только стек для размещения данных, но и куча.Поскольку размер массива известен во время компиляции, он может быть уже выделен.Но что произойдет, если объем памяти неизвестен при компиляции и должен быть распределен динамически?Затем вы можете выделить необходимую память в куче и иметь указатель в стеке.Например:
char *ptr;
Распределяет указатель в стеке, и после этого вы можете выделить необходимую память в куче, используя malloc (или calloc):
ptr = malloc(10 * sizeof (char));
Это выделит10 байт памяти в куче.
С одной стороны, массивы освобождаются автоматически при освобождении стека, с другой стороны, память, выделенная в куче, должна быть явно освобождена, иначе может возникнуть утечка памяти.
Еще одно замечание: при запуске нескольких потоков каждый поток имеет свой собственный стек, но все они совместно используют одну и ту же кучу.Хотя при запуске нескольких процессов каждый процесс имеет свой собственный стек и кучу.