如果字符的最大容量是256,如何存储1000的字符数组?

如果字符的最大容量是256,如何存储1000的字符数组 ? 是否可以声明:char s [1000];

是的,这当然是可能的。

 char s[1000]; 

您可以将1000视为数组的“长度”,将256视为“宽度”。 你得到一个1000个char的数组。 每个char都是8位(至少在您使用的机器上),因此可以存储256个不同的值。 (实际上,将“宽度”视为8而不是256可能更合适。)

这是你的数组,每个框代表一个char

  +---+---+---+---+---+---+---+---+- -+---+ s: | | | | | | | | | ... | | +---+---+---+---+---+---+---+---+- -+---+ 0 1 2 3 4 5 6 7 999 

或者在这里显示各个位:

  +---+---+---+---+---+---+---+---+- -+---+ s: | | | | | | | | | | | 7 +---+---+---+---+---+---+---+---+- -+---+ | | | | | | | | | | | 6 +---+---+---+---+---+---+---+---+- -+---+ | | | | | | | | | | | 5 +---+---+---+---+---+---+---+---+- -+---+ | | | | | | | | | | | 4 +---+---+---+---+---+---+---+---+- -+---+ bit | | | | | | | | | ... | | 3 number +---+---+---+---+---+---+---+---+- -+---+ | | | | | | | | | | | 2 +---+---+---+---+---+---+---+---+- -+---+ | | | | | | | | | | | 1 +---+---+---+---+---+---+---+---+- -+---+ | | | | | | | | | | | 0 +---+---+---+---+---+---+---+---+- -+---+ 0 1 2 3 4 5 6 7 999 array index 

假设我们通过调用strcpy在数组中放入一个字符串:

 strcpy(s, "Hello!"); 

或者在我们声明时将其初始化:

 char s[1000] = "Hello!"; 

按字节,它看起来像这样:

  +---+---+---+---+---+---+---+---+- -+---+ s: | H | e | l | l | o | ! |\0 | | ... | | +---+---+---+---+---+---+---+---+- -+---+ 0 1 2 3 4 5 6 7 999 

或者按位看起来像这样:

  +---+---+---+---+---+---+---+---+- -+---+ s: | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | | | 7 +---+---+---+---+---+---+---+---+- -+---+ | 1 | 1 | 1 | 1 | 1 | 0 | 0 | | | | 6 +---+---+---+---+---+---+---+---+- -+---+ | 0 | 1 | 1 | 1 | 1 | 1 | 0 | | | | 5 +---+---+---+---+---+---+---+---+- -+---+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | | | 4 +---+---+---+---+---+---+---+---+- -+---+ bit | 1 | 0 | 1 | 1 | 1 | 0 | 0 | | ... | | 3 number +---+---+---+---+---+---+---+---+- -+---+ | 0 | 1 | 1 | 1 | 1 | 0 | 0 | | | | 2 +---+---+---+---+---+---+---+---+- -+---+ | 0 | 0 | 0 | 0 | 1 | 0 | 0 | | | | 1 +---+---+---+---+---+---+---+---+- -+---+ | 0 | 1 | 0 | 0 | 1 | 1 | 0 | | | | 0 +---+---+---+---+---+---+---+---+- -+---+ 0 1 2 3 4 5 6 7 999 array index 

剩下的arrays中有993个空格。

[PS to nitpickers:是的,那些是ASCII码,不,C标准没有指定字符编码。 但我认为我们可以放心地认为这些是提问者会看到的代码。

256是单个char的值的数量(通常是8位字节,256 = 2 8 )。

(请注意,C11标准允许使用更宽的char ,例如32位;但这种情况非常罕见

字符串是包含多个char的数组或内存区域,并且通常以零字节终止。

你可以拥有非常大的字符串,特别是使用C动态内存分配 。 例如,在某些计算机上

  char*hugestring = malloc(1000000000); 

可以成功。 然后你可以填充那个十亿字节的字符串。 在许多计算机上, malloc调用将失败,并且您总是需要检查malloc的结果,至少遵循以上行

 if (!hugestring) { perror("malloc hugestring"); exit(EXIT_FAILURE); }; 

如果你使用malloc ,不要忘记以后free打电话(你需要有关于谁负责的约定 ); 否则你有内存泄漏 。 顺便说一下, asprintf , strdup和open_memstream函数非常有用(但并不是随处可用),可以方便地构建动态分配的字符串(内部malloc由它们使用)。 像valgrind这样的工具有助于帮助检测内存泄漏。

你也可以有arrays。 如果它们是局部变量 (也就是自动变量 ),它们通常位于调用堆栈中 (除非编译器针对它们进行了优化)。

例如,使用snprintf安全地填充本地缓冲区(没有缓冲区溢出 ),

 char buffer[100]; snprintf(buffer, sizeof(buffer), "x=%d, name=%s", x, name); 

但是拥有大的调用帧是不合理的,因此本地数组通常应少于几百个字节(或者可能是几千个字节)。 整个调用堆栈通常限制为一个或几兆字节。 细节是系统特定的。

注意字符编码问题。 在2017年至少读取utf8everywhere.org和关于Unicode ….所以将char视为一个字节(因为一些UTF-8字符需要几个字节,所以需要表示几个 char -s,因此在我的Linux桌面strlen("être")是5, sizeof("être")是6,因为加强的ê字母是两个字节的UTF-8编码)。 您可以使用libunistring之类的库 。

另请参阅一些C参考 。

你似乎误解了你所说的char “容量”。 char是一个8位值,这意味着它的范围可以是0000 0000b ()1111 1111b (255)

这仅指一个单独的值。 这意味着你可以写char c = 20; ,但不是char c = 1000;

因此,这意味着单个char有256个不同的可能值。


数组是一个不同的概念:数组存储一个特定类型的多个值 – 例如字符数组。

回答你的问题:是的,你可以在数组中存储1000个char值,比如Steve Summit建议的char s[1000]

当然,如果你有1000个字符,这意味着会有重复(因为只有256个唯一字符可能)。