C++ 在c+中查找字符数组的长度+;

C++ 在c+中查找字符数组的长度+;,c++,function,char,sizeof,C++,Function,Char,Sizeof,我有一个字符数组的形式 字符x[]='asdasdasdas' int p=sizeof(x)/sizeof(*x) 给出了正确的结果,但当我在另一个函数(如 空X(字符*a) int i=sizeof(a)/sizeof(*a) 我称之为 X(X) p和i不相等。怎么可能呢?当char数组被传递给接受char*的函数时,数组被称为对指针的“衰减”。此转换是自动的,并且编译器以前静态可用的长度信息丢失 可能的解决办法是: 将数组的大小作为附加参数传递 使char-数组以0结尾(即字符串文字),

我有一个字符数组的形式

字符x[]='asdasdasdas'
int p=sizeof(x)/sizeof(*x)

给出了正确的结果,但当我在另一个函数(如

空X(字符*a)

int i=sizeof(a)/sizeof(*a)

我称之为

X(X)


p和i不相等。怎么可能呢?

char
数组被传递给接受
char*
的函数时,数组被称为对指针的“衰减”。此转换是自动的,并且编译器以前静态可用的长度信息丢失

可能的解决办法是:

  • 将数组的大小作为附加参数传递
  • 使
    char
    -数组以0结尾(即字符串文字),并使用
    strlen
    。这是C和C++中字符串操作的常用方法。然而,这引入了运行时成本,这并不是严格必要的。但是,它提供了一些便利(静态和动态大小的字符串使用相同的API)和错误恢复能力(长度总是正确的)
  • 使用模板捕获阵列的长度
这里,
a
是指针,
*a
是字符。因此
sizeof(a)
不会返回数组的大小,而是返回指向数组中第一个元素的指针的大小

为了找到字符串的长度(与“数组大小”不同),您有几个选项

第一,根本不要使用
char*
,而是使用
std::string
(可能会创建临时):

第二,扫描字符串以查找空终止符(线性复杂度):

第三,使用模板(不必要的复杂代码):

C风格的数组会出现它们自己的问题,最好完全避免。不要使用C型阵列,而要使用StdLib针对此问题设计的工具:

std::string x = "asdasdadsadasdas";
提供指针的大小。我的系统上有八个字节

char x[] = "fred"; 
sizeof(x);
返回5。以null结尾的字符串的大小

void x(char * c) { 
sizeof (*c); 
} 
返回字符的大小


无论将数组的长度或原始类型传递给void x(),这都是正确的。请注意,sizeof()是在编译时计算的。在编译时,编译器通常无法知道传递的数组长度。如上所述,对于字符串长度的运行时评估,如果您确实希望字符串长度以字符为单位,请使用strlen。(或者是一个模板——但这可能是一个更不寻常的解决方案)

你是对的,但是数组还是以零结尾的,不是吗?使用整数数组时没有这样的问题。你真的确定可以编译吗?为什么数组是
char
?使用
std::string
std::vector
,您可能会更轻松,这取决于您实际尝试的操作。@Deduplicator是的,它可以完美地编译
char x[]='asdasdas'
这应该是一个错误,使用多字符常量初始化长度未知的字符数组。您正在使用
-Wall-Wextra-pedantic
并将所有警告视为错误?对多字符常量没有任何注释?@Deduplicator:抱歉?x的初始值设定项只有单引号,没有双引号。
template <size_t N> void X (const char (&arr)[N])
{
  size_t i = N;
}
char x[]='asdasdadsadasdas';
std::string x = "asdasdadsadasdas";
sizeof(char *) 
char x[] = "fred"; 
sizeof(x);
void x(char * c) { 
sizeof (*c); 
}