c - C 中的空字节和数组

标签 c arrays

如果我像这样声明一个包含 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/

相关文章:

c - 指向结构递增的指针

c - 两个指针的段错误

从数组中复制字符

c++ - lua_pop 与 lua_remove

ruby - 如何将 'gets' 输入放入数组?

c - 打印字符数组元素

arrays - 手动展开 3 个嵌套循环 (Julia)

c - 这段代码有什么错误?

c - lstat 函数导致的意外段错误

c - 如何将 uint8_t 值数组转换为 C 中的十六进制转储 char 字符串