即使使用int foo(char str[]);
将数组初始化为字符串文字sizeof也不起作用。我被要求做像strlen这样的事情,我想采取的方法是在整个字符串上使用sizeof然后根据某个不常见的令牌相应地减去。削减一些操作,而不是简单地计算所有内容。
所以,是的,我尝试在数组上使用解除引用运算符(也是指针,尝试过),但我最终得到的只是第一个数组元素。
我如何通过参数传递sizeof。我认为通过值传递可能会有效,但我真的不知道是否可以使用字符串。
答案 0 :(得分:2)
int foo(char str[]);
将数组初始化为字符串文字
这不是那样做的。 char str[]
此处与char* str
相同。当数组类型用作参数的类型时,它将转换为相应的指针类型。
如果你需要函数中指向数组的大小,你需要自己传递大小,使用另一个参数,或者你需要在函数中自己计算它,如果这样做的话(例如,在使用C字符串的场景中,您可以轻松找到字符串的结尾。)
答案 1 :(得分:1)
您无法在此处使用sizeof
。在C数组中,当传递给函数时将衰减指针,因此sizeof
会根据平台为您提供4
或8
- 指针大小。按建议使用strlen(3)
,或将数组大小作为显式第二个参数传递。
答案 2 :(得分:0)
C字符串只是char
的数组。数组不以C中的值传递;相反,传递了指向其第一个元素的指针。
所以这两个是相同的:
void foo(char blah[]) { ... }
void foo(char *blah) { ... }
这两个是相同的:
char str[] = "Hello";
foo(str);
char *p = str;
foo(p);
答案 3 :(得分:0)
您不能将数组作为函数参数传递,因此您无法在函数中使用sizeof
技巧。在大多数上下文中,数组表达式被隐式转换为指针值,包括函数调用。在函数参数声明的上下文中,T a[]
和T a[N]
与T *
同义。
您需要将数组大小作为单独的参数传递。