C функція повертає масив
Повертати char * на локальну змінну - ви з дуба впали? Що ви за поради даєте, двієчник?
alexrublev, в Сі не можна повертати покажчик на локальну змінну. Якщо вам треба повернути рядок, масив, структуру, шматок пам'яті, роблять по іншому (є 2 варіанти):
1) викликає сторона виділяє буфер в пам'яті і передає в функцію покажчик і його довжину. Функція заповнює його даними
2) функція динамічно розміщує масив в купі через new і повертає покажчик на нього. Це безглуздий спосіб, так як одна функція виділяє пам'ять, інша її звільняє і легко заплутатися.
А можна вам питання: ось якщо я хочу застосувати «недурацкій» спосіб, але викликає функція просто не знає, якої довжини буфер потрібен спричиненої? Наприклад, у мене функція
char * format (char * str.);
Як мені інакше розрулити таку ситуацію «не по-дурному»?
З запасом брати - не варіант. Я ж взагалі не знаю, як її будуть використовувати, може кому спаде на думку цілий мегабайт рядки отформатіть, не забороняти же мені це.
> А можна вам питання: ось якщо я хочу застосувати «недурацкій» спосіб, але викликає функція просто не знає, якої довжини буфер потрібен спричиненої?
Взагалі, гарне питання. Я, чесно кажучи, в розгубленості. Мені здається, недурацкім способом в Сі без об'єктів і без милиць зробити таке не можна.
Але в Сі ++, слава Страуструпом, за допомогою милиць і шаблонів можна приробити підрахунок посилань таким чином, що буфер, виділений в функції, буде автоматично звільнятися через непотріб. Тобто, ми передаємо в функцію порожній об'єкт MyString або MyArray, а функція його заповнює даними.
У чому профіт від передачі порожнього об'єкта-контейнера в функцію замість динамічного створення та повернення з функції? У тому, що передати можна локальний об'єкт (розміщений на стеку) і заощадити процесорний час на ме-е-едленном динамічному виділенні пам'яті.
Ха, і після цього знаходяться люди, що відмовляються приймати блага ООП і пишуть на Сі. Як вони, цікаво, такі проблеми вирішують? Роблять контейнер зі структури з функціями?
> А можна вам питання: ось якщо я хочу застосувати «недурацкій» спосіб, але викликає функція просто не знає, якої довжини буфер потрібен спричиненої? Наприклад, у мене функція
char * format (char * str.);
У такому випадку застосовують динамічні структури типу стек, чергу і тд
> Ха, і після цього знаходяться люди, що відмовляються приймати блага ООП і пишуть на Сі. Як вони, цікаво, такі проблеми вирішують? Роблять контейнер зі структури з функціями?
Спробуйте-но попрограмміровать мізки контролерам і процесорам з ООП