我有一个
形式的字符数组char x [] ='asdasdadsadasdas';
int p = sizeof(x)/ sizeof(* x)
给了我正确的结果,但当我把它作为参数传递给另一个函数,如
void X(char * a)
int i = sizeof(a)/ sizeof(* a)
我称之为
X(x)的
p和我不平等。怎么可能?
答案 0 :(得分:2)
当char
数组传递给接受char*
的函数时,该数组被称为“衰减”到指针。此转换是自动的,并且以前静态可用于编译器的长度信息将丢失。
可能的解决方案是:
char
- 数组0终止(即字符串文字)并使用strlen
。这是在C和C ++中对字符串进行操作的常用方法。然而,这引入了运行时成本,这不是严格必需的。但是它提供了一些便利(对于静态和动态大小的字符串使用相同的API)和错误恢复(长度始终是正确的)。答案 1 :(得分:1)
void X(char* a)
int i = sizeof(a)/sizeof(*a)
此处,a
是指针,*a
是char。所以sizeof(a)
不会返回数组的大小,而是指向数组中第一个元素的指针的大小。
为了找到字符串的长度(它与&#34;数组&#34的大小相同;),您有几个选项。< / p>
一个,根本不使用char*
,但std::string
(可能会创建一个临时的):
void X (const std::string& s)
{
size_t i = s.length();
}
二,扫描字符串以寻找空终止符(线性复杂度):
void X (const char* p)
{
size_t i = strlen (p);
}
三,使用模板(不必要的复杂代码):
template <size_t N> void X (const char (&arr)[N])
{
size_t i = N;
}
以上每一项都有它自己的缺点。但如果您更广泛地了解您的计划并了解您可以在哪些方面进行改进,这一切都是最好的避免。这是一个突出我的人:
char x[]='asdasdadsadasdas';
C风格的数组提出了自己的问题,最好完全避免。不要使用C风格的数组,而是使用专为此问题设计的StdLib工具:
std::string x = "asdasdadsadasdas";
答案 2 :(得分:1)
sizeof(char *)
给你指针的大小。我的系统上有八个字节。
char x[] = "fred";
sizeof(x);
返回5.具有空终止的字符串的大小。
void x(char * c) {
sizeof (*c);
}
返回char的大小。
无论将数组的长度或原始类型传递给void x(),都是如此。请注意,sizeof()在编译时进行评估。在编译时,编译器通常无法知道它已经传递了多长的数组。对于字符串长度的运行时评估,如上所述,如果您确实希望字符串长度为字符,请使用strlen。 (或模板 - 但这可能是一个更不寻常的解决方案)。