2014-09-29 106 views
0

我构造以与阵列:获取长度

char *state[] = {"California", "Oregon", "Texas"};

我想要得到加利福尼亚的长度应为10但是当我做的sizeof(状态[0]) ,它只是给我8(我认为这意味着8个字节,因为char的大小是1字节)。但为什么8而不是10?我仍然能够通过循环状态[0] [i]打印出加州的每个字符。

我是C新手,有人可以向我解释这个吗?

+0

使用['strlen'](http://en.cppreference.com/w/c/string/byte/strlen)。 – juanchopanza 2014-09-29 07:06:48

+0

使用'strlen',而不是'sizeof'。 – 2014-09-29 07:06:50

+0

'state [0]'不是一个字符串,它是一个字符指针。 'sizeof'给出了内存中变量的大小,在这种情况下是8个字节(如果state [0]是一个整数,它将返回4)。 C没有字符串长度的概念,找到它的唯一方法是遍历数组,直到遇到字符'\ 0'(C中的所有字符串通常以该字符结尾) – makhan 2014-09-29 07:19:46

回答

3

最简单的解释是sizeof编译时间求值的表达式。因此它对字符串的长度一无所知,它基本上是需要在运行时进行评估的东西。

要获取字符串的长度,请使用strlen。返回字符串的长度为而不是,包括隐含的空终止符,它告诉C运行时字符串的末尾在哪里。

另一件事,在设置字符串数组时使用const char* []是个好习惯。这加强了这样的事实:它是未定义的行为修改任何的数组内容。

+0

但是,这些是字符串文字,sizeof运算符知道的。 'sizeof(“California”)'是非常好的代码,并且会给出字符串长度。问题是这些字符串是通过指针引用的,所以类型信息会一路丢失。 http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c – Lundin 2014-09-29 08:09:07