使用sizeof with char * array []

时间:2015-05-30 20:32:33

标签: c arrays

我是编程新手。现在我正在学习CJava

我有一个这样的数组 -

char *array = {"zero", "one", "two", "three"};  

从这个link我可以像这样打印数组内容 -

printf("%s %s", array[0], array[1]); //zero one  

但我的问题是如何打印array[0]array[1]引用的长度等等。我知道我可以做这样的事情 -

printf("%d\n", sizeof("zero");  

但是我可以使用array变量本身打印大小。

我尝试过不同的方式,比如 -

printf("%d\n", sizeof(array[0]);  //4
printf("%d\n", sizeof(*array[0]);  //1

但每次我得错了答案。

由于

3 个答案:

答案 0 :(得分:4)

数组中每个元素的大小相同,因为数组被声明为指针数组

char * array[] = {"zero", "one", "two", "three"};  
^^^^^^

(注意你必须使用记录数组[])

这就是数组的每个元素都有char *类型,相应地,在运行程序的环境中它的大小等于4。

实际上,您希望获得由数组元素指向的字符串文字的大小。为此,您可以使用标头strlen中声明的标准C函数<string.h>该函数将返回字符串文字中的字符数,直到终止零字符。

printf( "%zu\n", strlen( array[0] ) ); // returns 4 for "zero"
printf( "%zu\n", strlen( array[1] ) ); // returns 3 for "one"

答案 1 :(得分:1)

您需要strlen

printf("%d\n", (int) strlen(array[0]));

答案 2 :(得分:1)

  1. 首先,如果你想声明一个char * ie char指针的数组,对于字符串文字,会遗漏两件事,[]和{{1}因为你不想意外地修改它,所以

    const

    将是正确的方式。

  2. 原因是const char *array[] = {"zero", "one", "two", "three"}; 终止符,在

    nul

    正确的值为printf("%zu\n", sizeof(array[0])) 而非5,因为4使用"zero"字节5而不是"zero\0",最后一个是标记ac字符串结尾的4终止符。

    如果你的字符串非常简单和规则,那么nul将给出正确的值,虽然它不是一个健壮的解决方案,因为它假设字符串是一个简单的字符串,如{{1}如果字符串嵌入sizeof(array[0]) - 1字节,它将失败,例如"zero",这是一个有效的字符串文字,'\0'将给"zero\0one\0"

    在c中获取字符串长度的正确方法是迭代字节,直到sizeof出现,这是strlen()的作用,因此您可以使用10非常小心,因为如果你不小心,它也可能很容易失败,而且

    '\0'

    将返回strlen(),因为printf("%zu\n", strlen("zero\0one\0")); 的第一次出现将足以让函数返回。

    由于同样的原因,4也会输出'\0'

    printf("%s\n", "zero\0one\0");最危险的事情是传递一个非zero终止的序列,这将导致未定义的行为,字符串文字完全没有危险,但是如果定义一个数组并且手动填写字符,很容易忘记添加终止strlen(),而且使用nul并不难。