C数组和空字节
为了更好地理解数组和空字节在C中是如何工作的,我有一个问题 假设我有一个包含13个单元格的整数数组。 假设我希望单元格编号:1、2、3和10有一个值。其他保留为默认值的,是否自动获取nullchar\0作为值C数组和空字节,c,arrays,null,int,C,Arrays,Null,Int,为了更好地理解数组和空字节在C中是如何工作的,我有一个问题 假设我有一个包含13个单元格的整数数组。 假设我希望单元格编号:1、2、3和10有一个值。其他保留为默认值的,是否自动获取nullchar\0作为值 我对\0的理解是,空字节总是在数组的末尾,它的功能是告诉程序数组的结尾。但似乎是错的 我写了一个简单的程序来验证这一点,看起来是这样的: int nums[13] = {1,2,3}; nums[10] = 69; int i; for(i=0;i<13;i++) { if(
我对\0的理解是,空字节总是在数组的末尾,它的功能是告诉程序数组的结尾。但似乎是错的 我写了一个简单的程序来验证这一点,看起来是这样的:
int nums[13] = {1,2,3};
nums[10] = 69;
int i;
for(i=0;i<13;i++) {
if(nums[i]=='\0') {
printf("null char found! in position: %d\n",i);
}
else {
printf("element: %d found in position: %d of int array\n",nums[i],i);
}
}
return 0;
int nums[13]={1,2,3};
nums[10]=69;
int i;
对于(i=0;i在C中不要求数组在末尾需要一个\0
。NUL终止符仅用于C字符串(通常具有char
或wchar\t
或其他字符类型)。在C字符串中,\0
字节也不必位于包含它的数组的末尾,但它必须位于字符串部分的末尾。在数组中的任何位置都有0是完全有效的。但是如果该数组用作字符串,则标准C字符串函数将解释索引最低的0,以表示en线的长度
当您在C中声明变量(nums
)时,在C中使用初始值设定项({1,2,3}
)
初始化器(3到12)中未提到的所有索引都已初始化为“代码> 0”/代码>。不可能在数组中有“空”单元。所有单元格都有一个值,由程序(MER)考虑哪些值是空的。
< P> C类型对应于内存,内存没有真正的“空”概念。.有些语言可以通过放置一些“空”常量(例如Python有None
)使所有(或几乎)内容都变为“空”),但C不允许这样做。不允许这样做的一个原因是,它强制您为空状态创建一个特殊的通用模式,这会产生低级别的影响。例如,一个字符可以包含0到255之间的任何值。这是因为字符占用8位。如果您还希望在不牺牲po的情况下拥有空状态对于字符值,您至少还需要一个位,因为其他8位可以用于合法的原因,这在很多情况下都是不可取的
对于数组,使用的初始化语法将每个未指定的元素设置为零。如果写入:
char foo[4] = {1, 2, 3, 4};
char foo[4] = {1, 2};
char foo[4];
然后每个元素都有一个值(请注意,它的结尾没有空字节,因为数组不需要在结尾有空字节–但是,如果您将它们用作字符串,那么它们非常应该有空字节)。如果您编写:
char foo[4] = {1, 2, 3, 4};
char foo[4] = {1, 2};
char foo[4];
元素0和1有一个指定的值,但2和3没有,使用此语法C将假定您希望将它们设为零。另一方面,如果您编写:
char foo[4] = {1, 2, 3, 4};
char foo[4] = {1, 2};
char foo[4];
您没有为任何元素分配任何值,在这种情况下,C根本不会初始化数组。从中读取是未定义的行为;实际上,元素通常会获取以前在其内存位置存在的任何内容的值。首先,您将C字符串与常规数组混淆。Wi在字符串中,char
数组的末尾总是有一个\0
。它表示字符串的结尾。例如,假设您有以下内容:
char myText[] = "hello";
在本例中,阵列位置如下所示:
myText[0] = 'h';
myText[1] = 'e';
myText[2] = 'l';
myText[3] = 'l';
myText[4] = 'o';
myText[5] = '\0';
根据您的规则,由于数组必须以'\0'
结尾,这不是一个合法的声明,因为我们只给数组3个元素而不是4个元素,我们需要4个元素来包含'\0'
。但是,这在C中是完全合法的声明。显然,数组中不需要'\0'
的空间,就在C字符串的末尾
另请注意,'\0'
等同于整数,如注释中所指出:
\0
(空字符)与空指针不同。\0
是一个所有位都设置为0的字节,其比较值总是等于int 0
因此,在您的程序中,您可以同样检查:
if(nums[i] == 0)
现在,让我们来证明为什么要获得输出
空字符不应该只在整个数组的末尾出现一次吗
否。保留为空的任何其他元素都将用零值初始化。因此,这就是您看到输出的原因;不是num[0]
、num[1]
、num[2]
、或num[10]
的元素将用零初始化。因为您正在检查\0
(还有0
)那么,不包含这些元素的所有其他元素都将为0
正如注释中指出的,空字符和空指针文字是不同的。在C字符串的末尾,可以看到空字符(NUL),它是'/0'
或0。但是,空指针文字(null
)是不同的。null定义为(void*)0-
普通ptr铸造为零,
wich等于NUL字符的(\0)ascii码-0
数组不需要以任何特殊字符/数字结尾
字符串确实需要以特殊字符结尾,原因很简单,它让对字符串进行操作的函数“知道”字符串的结尾,例如:
int myArray[3] = {1, 2, 3};
char str[100] = {'h','e','l','l','o',0}; // same as {'h','e','l','l','o','\0'}
printf("%s",str);
印刷品:
你好
如果字符串中的最后一个字符不是NUL,它将在字符串(“hello”)后打印95个垃圾字符,因为数组大小是100,编译器无法知道字符串的结尾
即使在大多数编译器中,第6个单元格的零是字符串的结尾,您也只能设置“hello”字符串,它们将用零填充其余单元格,因此在这两种情况下都可以。静态分配的内存中,标量为0,空值为0(\0)对于指针。如果将\0强制转换为标量,它将转换为0。不存在“空”这样的情况。无论如何,您不应该将NULL(\0)与int进行比较,请使用文字0。“我对\0的理解”