c中可以存储在数组中的最大元素数

时间:2017-06-20 11:05:17

标签: c arrays string

如果是复制问题,请原谅我。如果指出,我会很乐意删除它。

问题是,如果我在c中声明一个字符数组,请说

char character_array[4];

这是否意味着我只能存储3个字符,并且添加一个'/ 0'作为第四个字符?但我已经尝试过并成功地在字符数组中添加了四个字符。但是当我这样做的时候,因为我已经用完了四个位置而添加了'/ 0'?

3 个答案:

答案 0 :(得分:4)

嗯,是的,你可以存储任意四个字符。字符串终止字符'\0'就像任何其他字符一样。

但是你不必存储字符串,char是一个小整数,所以你可以这样做:

char character_array[] = { 1, 2, 3, 4 };

这使用了所有四个元素,但不存储可打印字符或任何终止;结果不是C字符串。

如果要存储字符串,当然需要容纳终止符,因为根据定义,C字符串总是以终止字符结尾。

C没有防止缓冲区溢出的保护,如果你瞄准你的脚并扣动扳机它通常会为你快乐地吹掉它。我们中的一些人喜欢这样。 :)

答案 1 :(得分:2)

你混合了两个概念:数组的概念和字符串的概念。

在此声明中

char character_array[4];

声明了一个可以存储4个char类型对象的数组。对象具有什么值并不重要。

另一方面,数组可以包含一个字符串:一系列限制为终止零的字符。

例如,您可以通过以下方式在C中初始化上面的数组

char character_array[4] = { 'A', 'B', 'C', 'D' };

char character_array[4] = "ABCD";

char character_array[4] = { '\0' };

char character_array[4] = "";

等等。

在所有这些情况下,数组有4个char类型的对象。在最后两种情况下,您可能会认为该数组包含字符串(空字符串),因为该数组具有零字符元素('\0')。在最后两种情况下,您可以应用于处理字符串的数组函数。

或另一个例子

char character_array[4] = { 'A', 'B', '\0', 'C' };

您可以像处理字符串"AB"或只有四个对象一样处理数组。

考虑这个示范程序

#include <stdio.h>
#include <string.h>

int main( void )
{
    char character_array[4] = { 'A', 'B', '\0', 'C' };

    char *p = strchr(character_array, 'C');

    if (p == NULL)
    {
        printf("Character '%c' is not found in the array\n", 'C');
    }
    else
    {
        printf("Character '%c' is found in the array at position %zu\n",
            'C',
            (size_t)(p - character_array));
    }

    p = ( char * )memchr(character_array, 'C', sizeof(character_array));

    if (p == NULL)
    {
        printf("Character '%c' is not found in the array\n", 'C');
    }
    else
    {
        printf("Character '%c' is found in the array at position %zu\n",
            'C',
            (size_t)(p - character_array));
    }
}

程序输出

Character 'C' is not found in the array
Character 'C' is found in the array at position 3

在程序的第一部分中,假设数组包含一个字符串。标准字符串函数strchr在遇到值为'\0'的元素后忽略数组的所有元素。

在程序的第二部分中,假设数组包含一系列长度为4的对象。标准函数memchr对字符串一无所知。

结论

此数组

char character_array[4];

可以包含4个字符类型的对象。这是宣布的。

如果数组中至少有一个元素等于'\0',则数组可以包含一个字符串if if将其内容解释为字符串。

例如,如果要声明数组

char character_array[4] = "A";

相当于

char character_array[4] = { 'A', '\0', '\0', '\0' };

然后可以说数组包含长度等于1的字符串“A”。另一方面,数组实际上包含4个char类型的对象,因为第二个等效声明显示。

答案 2 :(得分:0)

您只需保留4个字节即可填写。如果你写入_array [4](第五个字符),你有一个所谓的缓冲区溢出,意味着你写入非保留的内存。

如果您存储一个4个字符的字符串,实际上只有3个字符用于可打印字符(_array [0],...,_ array [2]),最后一个(_array [3])仅用于保存字符串终止'\ 0'。

例如,在你的情况下,函数strlen()解析,直到这样的字符串终止'\ 0'并返回length = 3.