如果我像这样声明一个包含 10 个字符的字符数组...
char letters[10];
我是否创建了一组内存位置,这些内存位置表示为索引 0-9 中的字符,然后第 10 个索引是空字节?
如果是这样,这是否意味着我真的在内存中为数组创建了 11 个位置(0 到 10),最后一个元素是空字节,或者我在内存中有 10 个位置(0 到 9)然后 C 添加了新位置的空字节(所以数组比我声明的长 1 个字节)?
谢谢
最佳答案
看来你对数组和字符串感到困惑。
当你声明
char letters[10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
然后它只在一个内存位置保留 10 个连续的字节。
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 //memory addresses. I assumed it is to be starting from 2000 for simplification.
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| | | | | | | | | | |
| '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' |
| | | | | | | | | | |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
在 C 中索引从 0
开始。您可以从 letters[0]
到 letters[9]
访问分配的内存位置。访问位置 letters[10]
将调用未定义的行为。但是当你这样声明时
char *letters = "0123456789";
或
char letters[11] = "0123456789";
然后内存中分配了11个字节的空间; 10 个用于 0123456789
,一个用于 \0
(NUL 字符)。
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 //memory addresses. I assumed it is to be starting from 2000 for simplification.
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
| | | | | | | | | | | |
| '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '\0' |
| | | | | | | | | | | |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
^
| NUL character
再举个例子
#include <stdio.h>
int main(){
char arr[11];
scanf("%s", arr);
printf("%s", arr);
return 0;
}
输入:
asdf
输出:
asdf
现在看看内存位置
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
| | | | | | | | | | | |
| 'a' | 's' | 'd' | 'f' |'\0' | | | | | | |
| | | | | | | | | | | |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
关于c - C 中的空字节和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20161921/