在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]));
}
由于某种原因,main中的printf显示的结果与f中的printf不同。 我需要知道数组中有多少元素。
答案 0 :(得分:19)
你不能。
您必须将大小传递给函数,例如:
void f(myStruct* array, size_t siz);
另请注意,在f
数组中是一个指针,而在main
中,它是一个数组。数组和指针是不同的东西。
答案 1 :(得分:10)
在f array
中是一个指针,在主array
中是一个数组。
答案 2 :(得分:1)
您必须将该数据作为单独的参数传递给该函数。在C和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]);
答案 3 :(得分:1)
在上面的代码中,函数f()无法知道原始数组中有多少元素。这是该语言的一个特点,没有办法绕过它。你必须通过这个长度。
答案 4 :(得分:1)
正如C reference所说,除非最后一个元素是唯一的,否则你不能这样做,或者你将数组元素的数量传递给函数。
答案 5 :(得分:1)
你必须使用特殊值结束数组,并且在被调用函数中,你必须计算到strlen()工作的值,它会计算为NULL'\ 0'值。
答案 6 :(得分:1)
请注意,在main()中,数组引用实际数组,因此sizeof()给出了所需的答案。
但是当你将它作为函数参数传递时,实际上是传递了存储在指针变量'array'中的数组的第一个元素的地址。
所以现在sizeof()给出了指针变量的大小,这就是它与实际答案不同的原因。
可能的解决办法是
1.全局声明数组
2.将数组大小作为函数参数 希望它有所帮助!
答案 7 :(得分:0)
您无法一致地判断 C 中数组中的元素数量。特别是如果你通过指针传递数组。
通常,如果必须在函数中使用数组大小,请将其作为参数传递给它。
答案 8 :(得分:0)
在sizeof
中使用main
时,它正在评估数组,并给出实际数组的大小。
在sizeof
中使用f
时,您已将数组的名称作为参数传递给函数,因此它已衰减为指针,因此sizeof
会告诉您关于指针的大小。
一般来说,如果将数组传递给函数,则需要将函数编写为仅使用一个特定大小的数组,或者显式传递数组的大小以使其适用于特定的调用。 / p>
答案 9 :(得分:0)
您可以使用阵列的格式。我正在使用字符串元素,它应该适用于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);
答案 10 :(得分:0)
作为解决方案的示例:
鉴于
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));
给出正确答案。
答案 11 :(得分:0)
int array[10]
int Number_of_elements = sizeof(array) / sizeof(array[0]);
printf("%d", Number_of_elements);