2014-03-02 98 views
0
#include <stdio.h> 
#include <stdlib.h> 

int constChars(const char* str) { 
    int size = sizeof(str)/sizeof(char); 
    printf("Size is %d.\n", size); 
    int i = 0; 
    for (i=0;i<size;i++) 
     printf("%c ", str[i]); 

    return 0; 
} 


int main(void) { 

    char a[10]={'b','c','d','e','f','f','f','f','f','f'}; 
    constChars(a); 
    return 0; 

} 

我写一块的像上面的代码,但输出的结果是: 大小为8 bcdeffff打印常量字符阵列通过的sizeof()的结果

我很困惑,为什么sizeof()函数给出8的大小? 我使用gcc和freebsd。

+3

指针不是数组。您正在计算指针参数的大小,而不是数组对象的大小。 – ouah

+0

我只是改变了一点,大小来自sizeof(str)/ sizeof(char)。所以它谈到了一些问题? – Stan666

+1

你正在测量str的大小,而不是[]。 str是一个指针... make a []任意大小,每次你仍然会得到8(在32位系统上是4)。 –

回答

4

当您将数组传递给函数时,它将被重写为指针,其中sizeof信息丢失。如果你这样做的,而不是main,即:

char a[10]={'b','c','d','e','f','f','f','f','f','f'}; 
int size = sizeof(a)/sizeof(a[0]); 
printf("Size is %d.\n", size); 

它打印10预期。但是一旦你将它传递给constChars,它就会打印一个指针的大小。

+0

那么有可能通过它的指针在函数内部获得一个常量数组的大小? – Stan666

+1

@ robbie88不,你必须和阵列一起传递长度。 – 2014-03-02 22:31:46

+0

可能值得注意的是,NULL终止字符流是解决这个问题的传统方法。通过在字符数组的末尾添加一个'\ 0',可以遍历一个字符串,直到达到'\ 0'。这是['strlen'](http://www.cplusplus.com/reference/cstring/strlen/)的工作原理。 – millinon

0

str是一个指向char的指针。这通常是4到8个字节。你没有得到数组的大小,而是变量的大小。知道数组长度的唯一方法是将大小与它一起传递,或者可以使用某种信号值(如\ 0)来删除数组,并进行一些迭代。