Есть ли простые способы узнать размер массива, передаваемого в функцию? Sizeof выдает размер адреса начала массива(2 байта), ведь в функцию передается адрес начала массива. Это что же получается, нужно создать массив внутри функции, скопировать в него значения из передаваемого массива и затем только высчитывать?

Комментарии: 99

  1. 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' Это такой способ работать с массивом "по ссылке", а не по значению. Строго говоря, это не ссылка, но дает возможность изменять данные не создавая их "копии" внутри функции.

  2. Jirafivanich

    Сайзоф вроде на стадии компиляции считается

  3. Serge

    Извините слоупока, но есть ещё способ, когда мы в сигнатуре ф-и прямо указываем какого размера массив она хочет fcn(char arr[static 42]); например. С динамическим размером 0-42 не полечит, но спасёт от выхода за границу. С99 или С1х, не помню. А так или передаем размер (отдельным аргументом, в структуре или как в паскалевских строках в 0м элементе), или вешаем терминатор в конец, как \0 в строках

Не нашли ответ?

Вам также может быть интересно