Ответ 1
Вы не можете.
Вы должны передать размер функции, например:
void f(myStruct* array, size_t siz);
Также обратите внимание, что в f
массив является указателем, а в main
- массивом. Массивы и указатели - это разные вещи.
В 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. Мне нужно знать, сколько элементов в массиве.
Вы не можете.
Вы должны передать размер функции, например:
void f(myStruct* array, size_t siz);
Также обратите внимание, что в f
массив является указателем, а в main
- массивом. Массивы и указатели - это разные вещи.
В f array
есть указатель, в главном array
- массив.
Вы должны передать эти данные в качестве отдельного параметра функции. В 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]);
В приведенном выше коде функция f() не имеет способа узнать, сколько элементов было в вашем исходном массиве. Это особенность языка, и нет никакого способа обойти его. Вы должны будете передать длину.
Как ссылается ссылка на C, вы не можете этого сделать, если только последний элемент не уникален или вы передаете количество элементов массива функции.
вам нужно закончить массив со специальным значением, а в вызываемой функции вы должны подсчитать до этого значения, а именно, как работает strlen(), оно подсчитывает значение NULL '\ 0.
Обратите внимание, что в main() массив ссылается на фактический массив, и поэтому sizeof() дает требуемый ответ.
Но когда вы передаете его как параметр функции, вы фактически передаете адрес первого элемента массива, который хранится в переменной-указателе "array".
Итак, теперь sizeof() задает размер переменной указателя, поэтому он отличается от фактического ответа.
Возможное решение может быть
1.Определить массив глобально
2.Вставьте размер массива в качестве параметра функции Надеюсь, это поможет!
Вы не можете последовательно указывать количество элементов в массиве в C. Специально, если вы передаете массив вокруг указателей.
Обычно, если вы должны использовать размер массива в функции, передайте его как параметр для него.
Когда вы используете sizeof
в main
, он оценивает массив и задает размер фактического массива.
Когда вы используете sizeof
в f
, вы передали имя массива в качестве аргумента функции, поэтому он разложился на указатель, поэтому sizeof
сообщает вам о размере указателя.
Вообще говоря, если вы передаете массив функции, вам нужно либо написать функцию только для работы с одним конкретным размером массива, либо явно передать размер массива для работы с определенным вызовом.
Вы можете использовать формат для своего массива. Я использую строковые элементы, он должен работать для 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);
В качестве примера для вашего решения:
Учитывая
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));
дает правильный ответ.