Есть ли простые способы узнать размер массива, передаваемого в функцию? Sizeof выдает размер адреса начала массива(2 байта), ведь в функцию передается адрес начала массива. Это что же получается, нужно создать массив внутри функции, скопировать в него значения из передаваемого массива и затем только высчитывать?
Комментарии: 99
Anonim
Динамический? Акстись, передавай размер, определенный при инициализации
Paschendale
гм. неужто странное желание у меня возникло?) хочу просто передавать массив и шоб все само делалось
Redsh
если ты про си, то в си нету способа передать массив (да и массивов тоже нет)
Paschendale
ага, я про си
Redsh
си - это более удобный ассемблер
Anonim
У тебя функция, которая принимает адрес на массив - все равно с ним что-то будет делать, вот и посчитает за одно, на сколько он меньше, чем объявлено. Но это тоже бред, нафиг не нужно.
Tiny
заверни массив и его размер в структуру и передавай
Jirafivanich
Массивы таки есть, но всегда фиксированные. Остальное - связанные списки
Redsh
ну, если открыть стандарт то слова "массив" ты не найдёшь и это не баг, это фича. потому что си - это язык - чистый лист, в нём есть только то что ты сам создаёшь и в том виде в котором тебе нравится
Jirafivanich
Я не настоящий стрелок в ногу, пока только учусь. Поверю тебе
Anonim
Угу, потому ли если индекс массива указать не тот, все пойдет по пизде?
Redsh
ну, простите, это вещь, созданная инженерами для инженеров если ты провод припаяешь не на тот контакт разъёма, всё так же точно пойдёт по пизде зато - возможность делать то что тебе нужно, так как тебе нужно
Vga
а как называется та хуйня, которая объявляется char[10] и имеет сайзоф 10?
Redsh
а не помню точно. в си любые непрерывные куски памяти называются объектами... массивом оно не является потому что это просто кусок памяти...
Tiny
An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type. The element type shall be complete whenever the array type is speci e d ISO/IEC 9899:201x 6.2.5.2 0
Redsh
ну да, и правда массивом называют) но суть в том что это не тот массив который во всяких пасквилях, который готовая структура данных со всякими методами
Tiny
ну да. в динамически типизируемых языках вообще массивы это дичь) где запись типа a[100] = 120 создает 100 элементов в рантайме
Anonim
Занимаюсь старыми транзисторами. Есть кт315е и другие. Какой ток на базе нужен этому транзистору, чтобы он открылся полностью на все свои 100мА?
Redsh
возьми та посчитай
Anonim
посчитываю, получается около 5мА. Но транзистор не открывается на 100мА hfe, показывает 138, может не так считал
Vga
Во всяких пасквилях массив точно такой же...
Anonim
Шта?? Ты не с питоном перепутал?
Vga
массив и есть кусок памяти...
Anonim
Им тяжело это понять переходя из высокоуровневых языков
Redsh
обычно массивом называется структура данных
Anonim
ШТА? Ну в питонах видимо да. В сях это просто кусок памяти который адресуется по оффсету Какая нахер структура данных? Даже структура - это тоже кусок памяти
Ogurezzz
разве malloc() не дает возможности создать "массив" в рантайме нужной длинны?
Anonim
без передачи длины никак массив как тип есть, но способа передать его в функцию нет
Keroron
а вот можно ли как-то заставить компилер предупреждать, если в ф-цию ожидающую скажем 3 аргумента передано всего 2? столкулся с хренью, что все это дело спокойно комилится, но при работе вызывает нетривиально находимые глюки
Anonim
Используй логику: считать размер затратнее, чем указать заведомо известный, даже если там тонна пустых значений. Массив подразумевает заполнение, значит, считать размер смысла нет
Ogurezzz
В Си в функцию надо передавать 2 аргумента: Адрес массива и его длину. Либо, если работает со строками, только адрес первого элемента, и функция работает до первого попавшегося '\0' Это такой способ работать с массивом "по ссылке", а не по значению. Строго говоря, это не ссылка, но дает возможность изменять данные не создавая их "копии" внутри функции.
Jirafivanich
Сайзоф вроде на стадии компиляции считается
Serge
Извините слоупока, но есть ещё способ, когда мы в сигнатуре ф-и прямо указываем какого размера массив она хочет fcn(char arr[static 42]); например. С динамическим размером 0-42 не полечит, но спасёт от выхода за границу. С99 или С1х, не помню. А так или передаем размер (отдельным аргументом, в структуре или как в паскалевских строках в 0м элементе), или вешаем терминатор в конец, как \0 в строках