C中的空字节和数组

时间:2013-11-23 11:48:51

标签: c arrays

如果我声明一个像10个字符的char数组,那么......

char letters[10];

我是否创建了一组内存位置,从索引0-9表示为字符,然后第10个索引是空字节?

如果是这样的话意味着我真的在内存中为数组创建11个位置(0到10),最后一个元素是空字节,或者我在内存中有10个位置(0到9)然后C添加新位置的空字节(所以数组比我声明的长1个字节)?

由于

3 个答案:

答案 0 :(得分:15)

好像你对数组和字符串感到困惑 当你宣布

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,1表示\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' |     |     |     |     |     |       |
 |     |     |     |     |     |     |     |     |     |     |       |
 +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+  

答案 1 :(得分:10)

  

我是否创建了一组内存位置,表示为索引0-9

中的字符

  

那么第10个索引是空字节吗?

没有

您预留了10 char秒的空间。没有其他的。没有什么会自动将最后一个字节设置为零,或者就像它一样。没有第11个字符可以容纳零,你只有10个。

如果您打算将其与字符串函数一起使用,那么作为程序员,您有责任确保字符串以空值终止。 (这意味着它最多可以容纳9个重要字符。)

初始化的一些常见示例:

// 10 chars exactly, not initialized - you have to take care of everything
char arr1[10];
// 10 chars exactly, all initialized - last 7 to zero - ok "C string"
char arr2[10] = { 'a', 'b', 'c' };
// three chars exactly, initialized to a, b and c - not a "C string"
char arr3[] = { 'a', 'b', 'c' };
// four chars exactly, initizalized to a, b, c and zero - ok "C string"
char arr4[] = "abc";

答案 2 :(得分:3)

在你的[Turbo(C ++)编程中,尝试使用F7,或者F8和Alt + F4,你可以看到里面发生的事情对于有这样疑虑的初学者会非常有用

当您声明变量时,单独的内存位置将被分配给该变量。 如果是数组变量,如

char letters[10];

十个内存空间将被分配给字母变量。

对于不同的数据类型(即int,char,float ...),内存分配的大小会有所不同。

再次在你的情况下:如果你想在数组中存储一个像“csstudent”这样的名字你已经声明一个数组大小为“十”甚至“csstudent”的大小是“九”,因为最后一个索引是存储“\” 0“字符表示字符串的结尾

// 1000,1001是分配的内存空间,可能会因系统而异

   1000  1001  1002  1003  1004  1005  1006  1007  1008  1009  
 +-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
 |     |     |     |     |     |     |     |     |     |      |
 | 'c' | 's' | 's' | 't' | 'u' | 'd' | 'e' | 'n' | 't' | '\0' |
 |     |     |     |     |     |     |     |     |     |      |
 +-----+-----+-----+-----+-----+-----+-----+-----+-----+------+