Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C数组和空字节_C_Arrays_Null_Int - Fatal编程技术网

C数组和空字节

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(

为了更好地理解数组和空字节在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(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的理解”