这可能吗?
size_t calculate(char *s)
{
// I would like to return 64
}
int main()
{
char s[64];
printf("%d", calculate(s));
return 0;
}
我想编写一个函数来计算main()
中声明的char数组的大小。
答案 0 :(得分:6)
只有指针参数calculate()
,您的函数s
无法计算数组的大小。数组的大小不是在指针中编码,也不是从指针访问。如果它被设计为采用以null结尾的字符串作为参数,它可以确定该字符串的长度;当然,这就是strlen()
的作用。但是如果它想知道它可以安全地复制到数组中的信息量,就必须告诉数组有多大,或者假设有足够的空间。
正如其他人所指出的那样,sizeof()
运算符可以在数组定义可见的函数中使用,以获得数组的大小。但是在无法看到数组定义的函数中,您无法有效地应用sizeof()
运算符。如果数组是一个全局变量,其定义(不是声明)在范围(可见)中写入calculate()
- 而不是函数的参数 - 那么calculate()
可以指示大小。
这就是许多C函数占用指针和长度的原因。缺少这些信息是为什么C在某种程度上容易让人误用它并产生“缓冲区溢出”错误,其中代码试图将一加仑的信息放入品脱罐中。
答案 1 :(得分:5)
在静态声明char[]
时,您可以使用运算符sizeof
,在这种情况下将返回64。
printf("%d", sizeof(s));
在动态声明的char*
上,无法获得已分配内存的大小。
动态数组是通过malloc
和朋友获得的。所有其他的静态声明,你可以在它们上使用sizeof
,只要你在声明数组的同一范围内使用它(在你的情况下,相同的函数,用于例子)。
答案 2 :(得分:3)
是的,如果s
在其数组的末尾有特定字符,则可能。例如,您可以拥有s[63] = 125
并且知道从0到62的每个其他字符都不是125,您可以执行for循环,直到找到125并返回数组的大小。
否则,这是不可能的,因为函数参数中的s
只是指向数组的指针,因此sizeof(s)
内的calculate
只返回机器指针大小,而不是64有人可以期待。
答案 3 :(得分:1)
不幸的是,您无法单独从指针值确定相应数组中有多少个元素。你需要在数组中使用某种类型的sentinel值(比如用于字符串的0终止符),或者你需要单独跟踪它。
可以做的是使用sizeof
运算符获取数组中的字节数或元素数:
char arr[64];
size_t size = sizeof arr; // # of bytes in arr
size_t count = sizeof arr / sizeof *arr; // # of elements in arr
但是,这只适用于arr
是数组类型的情况;如果您尝试在函数中执行此操作
size_t calculate(char *s)
{
return sizeof s;
}
它将返回指针值的字节的大小,而不是相应的数组对象。
答案 4 :(得分:1)
没有。 char *x
或char x[]
只是创建一个指向内存位置的指针。指针不包含有关内存区域大小的任何信息。
但是,char *x = "Hello"
占用6个字节(包括终止空值),strlen(x)
将返回5.这依赖于字符串末尾的空字符,strlen仍然不了解底层字符串缓冲。所以strlen("Hello\000There")
仍然是5。
答案 5 :(得分:-1)
这通常使用C中的宏来完成,例如:
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x))
这是一个好主意是一个完全不同的问题。