此问题在此处已有答案:
Miscalculation of array size inside a function(3个答案)
21天前关闭
typedef char String[100];
int main
{
String strArray[] = {"one", "two", "three"};
int numStrings = countStrings(strArray);
printf("count: %d\n", numStrings);
return 0;
}
int countStrings(String strArray[]) // doesnt work
{
int count = sizeof(strArray) / sizeof(strArray[0])
return count;
}
字符串
3条答案
按热度按时间deyfvvtc1#
这是因为当你将数组传递给
countStrings
时,它会衰减为char **
,而char **
并不包含它所指向的数组的长度信息。您需要将该信息传递给countStrings
函数。在
main
中,strings
仍然是一个数组,sizeof
将执行您所期望的操作。字符串
简短回答:求数组的长度很容易。找到一个 * 指针 * 的“长度”是没有意义的,它是你的函数接收的。
r3i60tvu2#
当你把一个数组传递给一个函数时,它会衰减为指向它的第一个元素的指针。在C中,这样的指针并不“知道”它指向多少个元素。因此,您不能仅通过此指针来计算元素。
一个可能的解决方案是添加一个特殊的元素,它标记数组的结束。
在这种情况下,您可以使用空字符串。这可以是长度为0的
String
。它的第一个字符是字符串结束标记'\0'
。字符串
请注意,这个解决方案将访问内存越界(超出给定的数组),如果数组错过了数组结束标记!
随意使用任何其他字符串作为标记。
正如你可能注意到的,同样的原则也用在C字符串上。即使
char
数组(您的String
)可以有容量,您也不能在其中存储实际长度。当你将一个String
传递给一个函数时,该函数会接收到指向第一个char
的衰减指针。字符串的结尾由特殊字符'\0'
标记。C标准库的所有字符串函数都需要这个特殊字符。
您将在
main()
的参数中找到该原则的另一种用法。标准第5.1.2.2.1章规定:argv[argc]
应为空指针。所以你有两个选项来迭代所有的程序参数:
1.从0到
argc - 1
计数;1.循环直到
argv[argc] == null
。在第J.5.1章“环境参数”中:
在托管环境中,
main
函数接收第三个参数char *envp[]
,该参数指向一个以null终止的char
指针数组,每个指针指向一个字符串,该字符串提供有关程序执行环境的信息(5.1.2.2.1)。因为没有给出
envc
(环境变量的计数),所以只能迭代直到找到null
指针。其他语言提供了其他解决方案。它们的数组更复杂,并且 * 可以 * 实际容纳元素的数量。
wnvonmuf3#
感谢所有的帮助!我可以使用这个功能。
字符串