Подтвердить что ты не робот

C: поиск количества элементов в массиве []

В C: Как вы находите количество элементов в массиве структур, после отправки его функции?

int main(void) {
  myStruct array[] = { struct1, struct2, struct3, struct4, struct5, struct6 };
  printf("%d\n", sizeof(array));
  printf("%d\n", sizeof(array[0]));
  f(array);
}
void f(myStruct* array) {
  printf("%d\n", sizeof(array));
  printf("%d\n", sizeof(array[0]));
}

По какой-то причине printf в основном показывает разные результаты, чем printf в f. Мне нужно знать, сколько элементов в массиве.

4b9b3361

Ответ 1

Вы не можете.

Вы должны передать размер функции, например:

void f(myStruct* array, size_t siz);

Также обратите внимание, что в f массив является указателем, а в main - массивом. Массивы и указатели - это разные вещи.

Ответ 2

В f array есть указатель, в главном array - массив.

Ответ 3

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

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

struct my_struct my_struct_array[] = {
 {"data", 1, "this is data"},
 {"more data", 2, "this is more data"},
 {"yet more", 0, "and again more data"}
};
const size_t my_struct_array_count = sizeof(my_struct_array)/sizeof(my_struct_array[0]);

Ответ 4

В приведенном выше коде функция f() не имеет способа узнать, сколько элементов было в вашем исходном массиве. Это особенность языка, и нет никакого способа обойти его. Вы должны будете передать длину.

Ответ 5

Как ссылается ссылка на C, вы не можете этого сделать, если только последний элемент не уникален или вы передаете количество элементов массива функции.

Ответ 6

вам нужно закончить массив со специальным значением, а в вызываемой функции вы должны подсчитать до этого значения, а именно, как работает strlen(), оно подсчитывает значение NULL '\ 0.

Ответ 7

Обратите внимание, что в main() массив ссылается на фактический массив, и поэтому sizeof() дает требуемый ответ.

Но когда вы передаете его как параметр функции, вы фактически передаете адрес первого элемента массива, который хранится в переменной-указателе "array".
Итак, теперь sizeof() задает размер переменной указателя, поэтому он отличается от фактического ответа.

Возможное решение может быть

1.Определить массив глобально

2.Вставьте размер массива в качестве параметра функции Надеюсь, это поможет!

Ответ 8

Вы не можете последовательно указывать количество элементов в массиве в C. Специально, если вы передаете массив вокруг указателей.

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

Ответ 9

Когда вы используете sizeof в main, он оценивает массив и задает размер фактического массива.

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

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

Ответ 10

Вы можете использовать формат для своего массива. Я использую строковые элементы, он должен работать для struct.

#define NULL ""
#define SAME 0

static char *check[] = {
      "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
      "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
      "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
      "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta",  "fcrypt",
      "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
      "lzo", "cts", "zlib", NULL
 }; // 38 items, excluding NULL

в main()

char **algo = check;
int numberOfAlgo = 0;


while (SAME != strcmp(algo[numberOfAlgo], NULL)) {
    printf("Algo: %s \n", algo[numberOfAlgo++]);
}

printf("There are %d algos in the check list. \n", numberOfAlgo);

Вы должны получить результат:

Algo: des 
   :
   :
Algo: zlib 

There are 38 algos in the check list.

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

numberOfAlgo = 0;

while (*algo) {
    printf("Algo: %s \n", *algo);
    algo++;         // go to the next item
    numberOfAlgo++; // count the item
}

printf("There are %d algos in the check list. \n", numberOfAlgo);

Ответ 11

В качестве примера для вашего решения:

Учитывая

struct contain {
char* a;        //
int allowed;    //

struct suit {
   struct t {
          char* option;
          int count;
   } t;

   struct inner {
          char* option;
          int count;
   } inner;
} suit;
};

//например. инициализируется

     struct contain structArrayToBeCheck[] = {
    {
        .a = "John",
        .allowed = 1,

        .suit = {
            .t = {
                .option = "ON",
                .count = 7
            },

            .inner = {
                .option = "OFF",
                .count = 7
            }
        }
    },
    {
        .a = "John",
        .allowed = 1,

        .suit = {
            .t = {
                .option = "ON",
                .count = 7
            },

            .inner = {
                .option = "OFF",
                .count = 7
            }
        }
    },
    {
        .a = "John",
        .allowed = 1,

        .suit = {
            .t = {
                .option = "ON",
                .count = 7
            },

            .inner = {
                .option = "OFF",
                .count = 7
            }
        }
    },
    {
        .a = "John",
        .allowed = 1,

        .suit = {
            .t = {
                .option = "ON",
                .count = 7
            },

            .inner = {
                .option = "OFF",
                .count = 7
            }
        }
    }

};

в main()

printf("Number of Struct within struct array: %d \n", sizeof(structArrayToBeCheck)/sizeof(struct contain));

дает правильный ответ.