2016-12-29 1 views
1

Отрывок из TopCoder article:Расчет размера массива с помощью SizeOf()

Выражение sizeof(data)/sizeof(data[0]) возвращает размер массива data, но только в несколько случаев, так что не использовать его в любом месте, за исключением в таких конструкциях. (C программисты со мной согласятся!)

Чтобы получить размер массива, я использовали это выражение sizeof(data)/sizeof(data[0]) все время для всех примитивных типов ,

Кто-нибудь знает о любом таком случае, в котором должно использоваться вышеуказанное выражение ?

+0

Используйте 'std :: vector' или' std :: array', и вам не будет интересно, когда это не сработает. – crashmstr

+0

Да, я использую их в C++. Но много раз я код на C, где я использую это выражение. Является ли этот язык проблем конкретным? –

+0

Я думаю, что это is not typesafe – SebNag

ответ

4

Если data были объявлены следующим образом:

int *data; 

И тогда пространство для нее выделяется примерно так:

data = malloc(NUM_ELEMENTS * sizeof(int)); 

Тогда ваша техника не будет работать, потому что sizeof(data) является размер указателя, а не содержание массива.

4

Подход sizeof скомпилирует, но не работает, указав указатель или массив неопределенного размера. Просто используйте правильный C++ подход:

template <typename T, std::size_t N> 
constexpr std::size_t size(T(&)[N]) { 
    return N; 
} 

Использование size() на массиве работает правильно. Это будет ошибка времени компиляции, чтобы использовать ее в случае, когда она не применима, например, на указателе.

+0

Или даже проще, так как 'C++ 11'' std :: extent :: value' – SebNag

+0

Спасибо .. Что это выражение называется ' T (&) [N] 'ie' & 'внутри скобок в качестве аргумента? Увидев это в первый раз. Какой термин мне нужно Google, любые подсказки? –

+1

@SebTu: как-то я думаю, что 'size (array)' выражает более четко то, что он намеревался, и его легче набирать, чем 'std :: extent :: value'. –

0

Коррекция работы метода sizeof для статического массива, у него не будет проблем. Как указано выше для динамических массивов и данных указателя, это будет работать неправильно.

Смежные вопросы