Vo_Vik написав:Може краще все ж якось інакше. Якусь інкапсуляцію зробити, фабрику класів, сінгтон вкінці-кінців.
Я пишу мовою С, а не С++ принципово, тому ООП можливо застовувати, але кишками назовні. Щодо шарів абстракцій, то з ними все в порядку.
Як я дійшов до char***?
Спочатку я послуговувався char*:
char *p = strdup("перша стрічка");
Потім мені довелося створити список стрічок, це вже char**:
char *list[] = {strdup("перша стрічка"), strdup("перша стрічка"), strdup("перша стрічка")}
А тоді мені довелося створити функцію, яка приймає як аргумента вказівник на список стрічок. щоби функція могла працювати зі самим вказівником на список стрічок.
Тобто код має бути десь такий:
DestroyList(char*** ppList, unsigned n);
Але насправді він такий, щоб можна було вивільнювати будь-які вказівники у списку, а не лише ті, що посилаються на стрічки:
DestroyList(void* ppList, unsigned n);
Таким чином, якщо я забуду дописати амперсанд перед змінню, то її функція з'їсть - бо всі типи жере, але в роботі крешнеться:
Правильне застосування функції:
Неправильне застосування функції: