Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2017, 16:28   #1
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию Sizeof array

Хотел написать функцию, которая возвращает размер указанного массива в байтах, но столкнулся с такой проблемой: функция всегда выдает 8 байт.
Код:
void sizeArray (short *array)
{
printf ("%zu\n", sizeof array);
return;
}
tutejshy вне форума Ответить с цитированием
Старый 27.06.2017, 16:33   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Потому что надо читать книги. Вы берете sizeof от УКАЗАТЕЛЯ, а это не массив.
p51x вне форума Ответить с цитированием
Старый 27.06.2017, 16:38   #3
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию

Цитата:
Потому что надо читать книги.
Очень за вас рад, что вы никогда ничего не спрашиваете, а любой вопрос решаете в библиотеке)

Тобишь определить размер массива через функцию нельзя? Только в том месте, где его объявлял?
tutejshy вне форума Ответить с цитированием
Старый 27.06.2017, 16:42   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от tutejshy Посмотреть сообщение
Очень за вас рад, что вы никогда ничего не спрашиваете, а любой вопрос решаете в библиотеке)

Тобишь определить размер массива через функцию нельзя? Только в том месте, где его объявлял?
В общем да....есть еще вариант

void sizeArray (short []array)

Но сразу скажу, лично я слабо представляю, как это сработает, и сработает ли вообще - попробуйте.

хотя, даже в main - передается число параметров = размер массива отдельно.

В целом, для С, вам нужен макрос, который дает размер.

Последний раз редактировалось alexzk; 27.06.2017 в 16:45.
alexzk вне форума Ответить с цитированием
Старый 27.06.2017, 16:49   #5
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию

Конкретно при такой записи:
Код:
[]array
компилятор выдает ошибку, а если вы имели ввиду:
Код:
array[]
то с этого ничего не выходит.
tutejshy вне форума Ответить с цитированием
Старый 27.06.2017, 16:50   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Очень за вас рад, что вы никогда ничего не спрашиваете, а любой вопрос решаете в библиотеке)
Оценил ваше невежество (а вы думали будет про юмор?). Это не любой вопрос, это базовый вопрос и он есть в почти каждой книге.

Цитата:
Тобишь определить размер массива через функцию нельзя? Только в том месте, где его объявлял?
Только через указатель нельзя. Используйте std::array или что-то подобное.
p51x вне форума Ответить с цитированием
Старый 27.06.2017, 17:17   #7
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию

Цитата:
Оценил ваше невежество
Оценил вашу неспособность вспомнить то, как сами начинали программировать: я как-то сомневаюсь, что вы, прежде чем написали "Hello world" целиком прочли книгу Ритчи и не задали ни одного вопроса. Ну а оценить мое невежество можно уже и тем, что Си я изучаю где-то неделю - как по-вашему, я слишком невежественный в Си при таком сроке обучения?
tutejshy вне форума Ответить с цитированием
Старый 27.06.2017, 21:34   #8
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
функция всегда выдает 8 байт.
Всё правильно. array - не массив. array - указатель.
Указатель - это не массив.
то бишь
Код:
int *p = new int[100];
p - не массив. И даже не указатель на массив. Это просто указатель на память, которую будем интерпретировать так, как будто там лежат значения типа int.
Код:
int p[10];
А это уже массив. Массивы нельзя копировать напрямую, тип массива может быть неявно ослаблен до указателя. Размер такого массива можно узнать в функции только если передать ссылку/указатель на такой массив:
Код:
void foo(int (&arr)[10])
{
    printf("%d", sizeof(arr));
}

int main()
{
    int arr[10];
    foo(arr);
}
Код:
void foo(int (*arr)[10])
{
    printf("%d", sizeof(*arr));
}

int main()
{
    int arr[10];
    foo(&arr);
}
Второй вариант прокатит и в C.
Но в C придется вручную смотреть за совпадением размеров,
т.е. в такую функцию в C можно передать массив любого размера, но вывод всё равно будет такой, как будто у нас массив из 10 элементов. Туда даже можно обычный указатель передать.
В C++ же требуется строгое соответствие размеров, так что передать туда указатель на массив другого размера не получится.
В C++ также можно для массивов использовать шаблоны:
Код:
template<typename T, size_t N>
void foo(T (&arr)[N])
{
    std::cout << sizeof(arr) << std::endl;;
}


int main()
{
    int arr[5];
    foo(arr);
}
В C и C++ часто используется два параметра. Первый - указатель, второй - количество элементов:
Код:
void foo(int *arr, size_t size)
{
}


int main()
{
    int arr[5];
    foo(arr, 5);
}
Конечно же из кодов выше все магические числа лучше заменить на константы.
Croessmah вне форума Ответить с цитированием
Старый 28.06.2017, 06:30   #9
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Код:
В общем да....есть еще вариант
Без указания размера
void foo(int a[]);
тоже самое, что и
void foo(int *a);
Croessmah вне форума Ответить с цитированием
Старый 28.06.2017, 11:17   #10
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию

Спасибо, это лучший ответ!
tutejshy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не получается преобразовать тип к array[1..6] of string к array[1..6] of string? юля123321 Помощь студентам 12 01.12.2016 15:21
Для чего существует коммутативность array[2] == 2[array] _PROGRAMM_ Помощь студентам 10 02.11.2014 13:33
sizeof() или не sizeof()? Madmaxisss Visual C++ 4 02.04.2012 21:26
SIZEOF? GerNick Общие вопросы C/C++ 6 22.01.2011 17:59
sizeof , rand , адрес переменных. Gradus C++ Builder 30 24.08.2010 23:12