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

C 如果字符的最大容量为256,如何存储1000个字符数组?,c,character,C,Character,如果字符的最大容量为256,如何存储1000个字符数组? 是否可以宣布: chars[1000] 是的,这当然是可能的 char s[1000]; 您可以将1000视为数组的“长度”,256视为“宽度”。您将得到一个1000个字符的数组。每个char是8位(至少在您使用的机器上),因此可以存储256个不同的值。(实际上,将“宽度”视为8而不是256可能更合适。) 这是您的数组,每个框代表一个char: +---+---+---+---+---+---+---+---+- -+---+

如果字符的最大容量为256,如何存储1000个字符数组? 是否可以宣布:
chars[1000]

是的,这当然是可能的

char s[1000];
您可以将1000视为数组的“长度”,256视为“宽度”。您将得到一个1000个字符的数组。每个
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
或者说,它看起来是这样的:

   +---+---+---+---+---+---+---+---+-   -+---+
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
数组中还有993个空格


[p.S.对挑剔的人说:是的,这些是ASCII码,不,字符编码不是C标准规定的。但我认为我们可以放心地假设提问者会看到这些代码。]

256是单个
char
中的值数(通常是8位字节,256=28)

(注意,C11标准允许更宽的
char
-s,例如32位;但这种情况非常少见)

字符串是一个数组或内存区域,包含多个
字符
-s,通常以零字节结尾

您可以有非常大的字符串,特别是使用。例如,在一些计算机上

 char*hugestring = malloc(1000000000);
你可以成功。然后你就可以填充十亿字节的字符串了。在许多计算机上,
malloc
调用将失败,您始终需要检查
malloc
的结果,至少要按照上面的命令执行

if (!hugestring) { perror("malloc hugestring"); exit(EXIT_FAILURE); };
如果你使用了,别忘了以后再打电话(你需要约定谁负责);否则,你会有一个错误。顺便说一句,和函数非常有用(但不是到处都可用),可以方便地构建动态分配的字符串(它们使用内部
malloc
)。像这样的工具有助于检测内存泄漏

也可以有数组。如果它们是(也称为)它们通常位于(除非编译器针对它们进行了优化)

例如,使用安全地填充本地缓冲区(无)

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

注意问题。2017年,至少阅读并了解。。。。所以把
char
看作一个字节(因为有些字符需要几个字节,所以用几个
char
-s来表示,因此在我的Linux桌面上
strlen(“être”)
是5,而
sizeof(“être”)
是6,因为重音的
字母是用两个字节编码的UTF-8)。你可以用一些像这样的图书馆


你似乎误解了你所说的
字符的“容量”
char
是一个8位的值,这意味着它可以在
0000 0000b()
1111111b(255)
的任何范围内

这仅指一个单独的值。这意味着您可以编写
charc=20,但不是
字符c=1000

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


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

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


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

是的,可以声明
字符[1000]。您所说的“最大容量”是什么意思?典型的
char
可能有256个值中的1个。数组中的元素数可以是
[1…SIZE_MAX)
@tarun Gupta您可能会混淆limit app architect和内存存储:当您创建静态数组时,将存储在二进制文件的PE.data/.rdata/.bss部分的堆栈上。使用新的malloc…时,将直接在堆上分配动态数组。可以n存储在单个字符中与字符数组的大小无关。这不像C使用字符串的第一个字节来存储字符串的长度。(某些语言,如Pascal,在某些实现中确实使用这种技巧。)吹毛求疵:你怎么能确定OP使用的是ASCII而不是UTF-8?我猜——从他的名字或伪名字来看——他可能不是美国人,所以更有可能(比美国公民)使用UTF-8而不是过时的ASCII。参见;在2017年,ASCII不是很常见,大多数计算机都使用UTF-8@BasileStarynkevitch当我写这篇文章时,我担心的是EBCDIC挑剔者,而不是UTF-8挑剔者。当然,我选择的示例字符串的编码在ASCII和UTF-8中都是相同的。但我想我必须解决这个问题最后一句…完成了。