当用作函数参数时,字符数组大小会发生变化

时间:2015-10-10 18:04:05

标签: c arrays

我想知道为什么这种确定数组大小的方法给出答案"我想到了。

根据我的解释,考虑到大小中包含的空指针,test2()的输出是正确的。但我不知道使用test1(char *s)时会发生什么。

代码

#include <stdio.h>
void test1(char *s);
void test2(); 
int main() {
    char s[] = "aaa";
    test1(s);
    test2();
    return 0;
}
void test1(char *s) {
    printf("cstring: %s\n", s);

    int size = sizeof(s)/sizeof(char);
    printf("size: %d\n",size);

    int test[] = {1,2,3,4,5};
    size = sizeof(test)/sizeof(int);

    printf("size: %d\n",size);
}

void test2() {
    printf("@test:\n");
    char s[] = "aaa";
    int size = sizeof(s)/sizeof(char);
    printf("size: %d\n", size);
    int i[] = {1,2,3,4,5};
    size = sizeof(i)/sizeof(int);
    printf("size: %d\n", size);
}

输出

cstring: aaa
size: 8
size: 5
@test:
size: 4
size: 5
[Finished in 0.0s]

1 个答案:

答案 0 :(得分:2)

在你的函数test1中,你只有一个char指针(char*),而不是一个数组。因此,sizeof(s)将返回指针的大小:如果构建为32位,则可以为4;如果构建为64位,则为8。

如果您确定要使用以空字符结尾的字符串,请使用strlen()代替其他人,在您的函数中添加size_t size参数。