Есть ли в C и / или C ++ места, где требуется массив вместо одного объекта?
Почему я использую массив из одного элемента вместо одного объекта? ?
Есть много функций, которые могут работать с массивами, которые принимают аргумент указателя. Однако, как уже указывал machine_1, вы можете легко получить указатель на обычный объект и передать его функции.
Однако есть несколько случаев, когда это имеет значение. В C ++, если вы хотите использовать range-for для итерации по нескольким объектам, вы можете написать:
int a[1] = {42};
for (auto &value: a)
...
Но вы не можете написать:
int a = 42;
for (auto &value: a)
...
Приведенный выше пример выглядит глупо сам по себе, но становится реальной проблемой, когда вы определяете функции generi c с помощью шаблонов. Поэтому иногда вам захочется сохранить значение в массиве длиной 1, чтобы упростить использование этих функций.
В C99 и более поздних версиях, но не в C ++, вы также можете использовать Flexible члены массива . Такие члены работают как массивы, но они не занимают места, как будто они имеют нулевую длину. Рассмотрим наличие сетевого пакета с заголовком и переменным объемом данных. Структура, представляющая пакет, может выглядеть следующим образом:
struct packet {
address_t source;
address_t destination;
size_t length;
char data[]; // flexible array member
};
Можно выделить память для такой структуры, например, так:
size_t data_length;
...
struct packet *pkt = malloc(sizeof(*pkt) + data_length);
А затем можно читать и записывать в часть данных вот так:
for (size_t i = 0; i < data_length; i++)
pkt->data[i] = ...;
Вам не нужен массив data[]
здесь, поскольку вы также можете получить доступ к данным, выполнив что-то вроде ((char *)pkt + sizeof(*pkt))[i]
, использование члена массива в конце структуры позволяет написание гораздо более компактного, удобочитаемого и безопасного кода.
Можно сделать аналогичный трюк в C ++ , используя массив длиной 1.
Is Есть физическая разница в размере выделения в памяти?
Нет.
Различаются ли C и C ++ в этом контексте?
номер