@Vad20

Как в языке си вернуть пустой массив?

Добрый день! Если входные данные являются пустым массивом или равны null, то возвращается пустой массив. Это как? в языке Си
  • Вопрос задан
  • 466 просмотров
Пригласить эксперта
Ответы на вопрос 4
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
А что непонятно-то?

ЕСЛИ
по данному адресу лежит '\0'
ИЛИ
данный адрес равен NULL
ТО
вернуть пустой массив (обьект памяти, указывающий на '\0' либо указатель на данный обьект)

Все :) В языке С нет отдельного понятия "массив", в нем все - обьекты памяти, а уж как интерпретировать результат, который тебе приехал - это твое дело. Посчитаешь массивом - будет массив, посчитаешь структурой - будет структура :) Посчитаешь массивом структур - будет массив структур :D
Ответ написан
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
В Си у массивов нет встроенной длины*. Массив - это обычно просто указатель на область памяти, где лежат его элементы. А сколько их там, надо как-то отдельно хранить и передавать. Можно, как в строках, помечать специальным символом конец, или можно передавать длину в отдельной переменной рядом с массивом.

Соответственно, чтобы вернуть пустой массив, надо вернуть массив длины 0. Ваша функция же как-то должна возвращать длину массива? Вот точно также, как если бы длина была 1, только 0. Или сразу первым элементом идет маркер конца массива. Или переменная длины, которую, скорее всего, придется сделать out параметром функции, будет содержать 0. Или можно NULL возвращать, как особый случай, что ничего нет.

* Исключение - статические массивы, где длина массива известна во время компиляции. Но его длину можно менять только в самом коде, поэтому тут этот случай не подходит.
Ответ написан
Комментировать
@skyazimuth
А что подразумеваете под "пустым массивом"?
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Если возвращаем НОВУЮ память:
1. вернуть массив заведомо бóльшей длины и поле длины.
struct Arr1 {
  int length;
  int data[100];
}
struct Arr1 someFunc() {}

2. Вернуть динамический массив.
struct Arr2 {
  int length;
  int* data;   // не забудь free(arr.data);
}
struct Arr2 someFunc() {}


Если работаем в ИМЕЮЩЕЙСЯ памяти.
3. Тот же Arr2, но разница в том, что data не надо высвобождать.
4. А если arr.data гарантированно понятное — то можно вернуть только int, поле длины (как в функции sprintf).
int sprintf ( char * str, const char * format, ... );

Она и возвращает массив — только его адрес гарантированно будет str и вернуть надо только длину.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы