Как определить размер моего массива в C?

Я бы использовал сокеты, но использовал Twisted, чтобы дать вам некоторую абстракцию и сделать все просто. Их простой пример Echo Client / Server - хорошее место для начала.

Вам просто нужно объединить файлы и создать экземпляр и запустить клиент или сервер в зависимости от переданного аргумента (с). [/ д2]

851
задан Peter Mortensen 28 February 2013 в 14:16
поделиться

6 ответов

Резюме:

int a[17];
size_t n = sizeof(a)/sizeof(a[0]);
<час>

Полный ответ:

Для определения размера массива в байтах можно использовать sizeof оператор:

int a[17];
size_t n = sizeof(a);

На моем компьютере, ints 4 байта длиной, таким образом, n равняется 68.

Для определения числа элементов в массиве мы можем разделить общий размер массива размером элемента массива. Вы могли сделать это с типом, как это:

int a[17];
size_t n = sizeof(a) / sizeof(int);

и получают надлежащий ответ (68 / 4 = 17), но если бы тип a изменился, то у Вас была бы противная ошибка, если бы Вы забыли изменяться sizeof(int) также.

, Таким образом, предпочтительный делитель sizeof(a[0]), размер обнуляет элемент массива.

int a[17];
size_t n = sizeof(a) / sizeof(a[0]);

Другое преимущество состоит в том, что можно теперь легко параметризовать имя массива в макросе и добраться:

#define NELEMS(x)  (sizeof(x) / sizeof((x)[0]))

int a[17];
size_t n = NELEMS(a);
1083
ответ дан einpoklum 28 February 2013 в 14:16
поделиться

@Skizz: Я вполне уверен, я прав, хотя лучшим "источником", который я могу дать Вам в данный момент, является Википедия от статьи о sizeof:

Википедия является неправильной, Skizz является правильным. sizeof (символ) равняется 1 по определению.

я имею в виду, просто читает статью в Википедии действительно тесно , чтобы видеть, что это неправильно. "кратные числа символа". sizeof(char) никогда может быть ничто другой , чем "1". Если бы это было, скажем, 2, это означало бы, что sizeof(char) был дважды размер символа!

4
ответ дан Peter Mortensen 28 February 2013 в 14:16
поделиться

Magnus: стандарт определяет sizeof как получение числа байтов в объекте и что sizeof (символ) всегда один. Число битов в байте является конкретной реализацией.

Редактирование: стандарт C++ ANSI разделяет 5.3.3 Sizeof:

sizeof оператор приводит к числу байтов в объектном представлении его операнда. [...] sizeof (символ), sizeof (символ со знаком) и sizeof (неподписанный символ) равняются 1; результат sizeof относился к любому другому фундаментальному типу, определяется реализацией.

Раздел 1.6 модель памяти C++:

фундаментальное устройство хранения данных в модели памяти C++ является байтом. Байт является, по крайней мере, достаточно большим для содержания любого члена основного набора символов выполнения и состоит из непрерывной последовательности битов, число которых определяется реализацией.

4
ответ дан Tim Cooper 28 February 2013 в 14:16
поделиться

sizeof "прием" является лучшим способом, которым я знаю, с одним маленьким, но (мне, этот являющийся главным главным объектом неприязни) важное изменение в использовании круглой скобки.

, Поскольку статья в Википедии ясно дает понять, C sizeof не является функцией; это оператор . Таким образом это не требует круглой скобки вокруг своего аргумента, если аргументом не является имя типа. Это легко помнить, так как это приводит, что аргумент похож на выражение приведения типа, которое также использует круглую скобку.

Так: Если у Вас есть следующее:

int myArray[10];

можно найти число элементов с кодом как это:

size_t n = sizeof myArray / sizeof *myArray;

, Что, мне, чтения, намного легче, чем альтернатива с круглой скобкой. Я также одобряю использование звездочки в правой части подразделения, так как это более кратко, чем индексация.

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

всегда лучше использовать sizeof на фактическом объекте, когда Вы имеете один, а не на типе, с тех пор Вы не должны волноваться о совершении ошибки и утверждении неправильного типа.

, Например, скажите, что у Вас есть функция что выводы некоторые данные как поток байтов, например, через сеть. Давайте вызовем функцию send() и заставим ее взять в качестве аргументов указатель на объект отправить, и число байтов в объекте. Так, прототип становится:

void send(const void *object, size_t size);

И затем необходимо отправить целое число, таким образом, Вы кодируете его как это:

int foo = 4711;
send(&foo, sizeof (int));

Теперь, Вы представили тонкий способ выстрелить себе в ногу путем определения типа foo в двух местах. Если Вы изменяетесь, но другой не делает, повреждения кода. Таким образом всегда делайте это как это:

send(&foo, sizeof foo);

Теперь Вы защищены. Несомненно, Вы копируете название переменной, но это имеет высокую вероятность повреждения способом, компилятор может обнаружить при изменении его.

45
ответ дан unwind 28 February 2013 в 14:16
поделиться

Стоит отметить, что sizeof не помогает при контакте со значением массива, которое затухло к указателю: даже при том, что это указывает на запуск массива к компилятору, это совпадает с указателем на единственный элемент того массива. Указатель не "помнит" ничто больше о массиве, который использовался для инициализации его.

int a[10];
int* p = a;

assert(sizeof(a) / sizeof(a[0]) == 10);
assert(sizeof(p) == sizeof(int*));
assert(sizeof(*p) == sizeof(int));
121
ответ дан Magnus Hoff 28 February 2013 в 14:16
поделиться
sizeof(array) / sizeof(array[0])
12
ответ дан Ted Percival 28 February 2013 в 14:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: