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