Это плохая практика программирования, чтобы объявить тип массива в C? - PullRequest
1 голос
/ 10 июля 2019

У меня есть несколько массивов различной длины, и я хотел бы, чтобы длина была близка к массиву. Разве плохая практика программирования - определять что-то подобное?

typedef struct Array {
  long len;
  int* buf;
} Array;

Есть ли какие-либо очевидные недостатки или подводные камни в этом?

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Нет, не обязательно.Вам нужно будет передать длину буфера с помощью указателя, чтобы убедиться, что вы не переполните его.Это было бы небольшим ударом по производительности из-за дополнительной разыменования, но это может быть полезным компромиссом, если всегда наличие доступной длины позволяет избежать ошибок.Вам нужно убедиться, что длина обновляется, если вы измените размер буфера, и убедиться, что буфер освобождается, если вы освобождаете свою структуру.Кроме этого, это имеет смысл для меня, и это то, что делают многие другие высокоуровневые языки в своих реализациях массивов.

1 голос
/ 10 июля 2019

Это нормально, аналогичная структура обычно используется для подсчитанных строк, то есть векторов, которые не заканчиваются нулем, поэтому необходимо хранить их длину.Я не стал бы беспокоиться о таком подходе, если бы массивы использовались только локально.

Как уже отмечалось, было бы лучше использовать тип без знака, такой как size_t или uint32_t для длины.

При работе с указателями необходимо принять обычные меры предосторожности, чтобы убедиться, что перед использованием или передачей у него всегда есть действительная ссылка, что выделенная память освобождена и т. Д. Использование valgrind Настоятельно рекомендуется.

...