为什么这两个sizeof给出不同的结果?

时间:2018-11-10 04:28:26

标签: c

我了解您是否有一个数组,并且执行sizeof,它给出了内存块所占用的字节数,但是我对以下情况有些困惑。

int mylen(const char *str) {
    return sizeof(str);
}

int main(void) {
    char str[] = "hello";

    printf("%d\n", sizeof(str)); // this gives 6
    printf("%d\n", mylen(str)); // this gives 8
}

我知道mylen只是返回sizeof char指针,因此返回8,但是在那种情况下,为什么第一个起作用?这是str和char *之间的微妙区别吗?

1 个答案:

答案 0 :(得分:0)

与之相同的原因

char foo[6];
sizeof(foo);  // yields 6

char *bar;
sizeof(bar);  // yields 8  (or in general: the size of a pointer on your system)

btw,由于sizeof运算符的结果为size_t类型,因此您的mylen()应该返回size_t(在<stddef.h>中定义),而不是int

此外,如果您想printf()使用size_t,则必须使用"%zu",而不要使用"%d"

有关更多详细信息,您可能需要阅读有关数组到指针衰减的内容:Why do arrays in C decay to pointers?