参数上的sizeof

时间:2011-09-19 13:44:20

标签: c arrays pointers sizeof

即使使用int foo(char str[]);将数组初始化为字符串文字sizeof也不起作用。我被要求做像strlen这样的事情,我想采取的方法是在整个字符串上使用sizeof然后根据某个不常见的令牌相应地减去。削减一些操作,而不是简单地计算所有内容。

所以,是的,我尝试在数组上使用解除引用运算符(也是指针,尝试过),但我最终得到的只是第一个数组元素。

我如何通过参数传递sizeof。我认为通过值传递可能会有效,但我真的不知道是否可以使用字符串。

4 个答案:

答案 0 :(得分:2)

  

int foo(char str[]);将数组初始化为字符串文字

这不是那样做的。 char str[]此处与char* str相同。当数组类型用作参数的类型时,它将转换为相应的指针类型。

如果你需要函数中指向数组的大小,你需要自己传递大小,使用另一个参数,或者你需要在函数中自己计算它,如果这样做的话(例如,在使用C字符串的场景中,您可以轻松找到字符串的结尾。)

答案 1 :(得分:1)

您无法在此处使用sizeof。在C数组中,当传递给函数时衰减指针,因此sizeof会根据平台为您提供48 - 指针大小。按建议使用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 *同义。

您需要将数组大小作为单独的参数传递。