sizeof()在c中检查int array []的sentinel值是什么

Dav*_*run 4 c arrays sizeof

让我们考虑一下int array [] = {2,33,4,56,7,8}; //案例A.

如果sizeof()选中'\ 0'作为char []数组的结尾!sizeof(array)检查作为一个sentinel值来查找int数组的结尾,因此在A的情况下数组的大小是多少?

如果我要实现sizeof(intArray),那么访问sentinel值信息是不是自由了?

das*_*ght 14

sizeof不检查任何东西.它看起来只是一个函数调用,但它实际上是一个运算符,一种编译技巧,可以在编译时插入编译器已知的大小.

以下是sizeof与C数组交互的方式:声明数组时,将其大小指定为常量,作为运行时整数表达式,或者通过提供一定数量的值来放入数组中.

在编译时知道元素数量时,编译器将替换sizeof(array)为实际数字.当元素数量在运行时才知道,编译器会准备一个特定的特定于实现的存储位置,并在那里存储大小.正在运行的程序将需要此信息进行堆栈清理.编译器还使sizeof实现的运行时部分知道此隐藏信息以返回正确的值.

  • sizeof仅在编译器知道大小时才有效.尝试在一个方法的数组参数上使用它 - 你会发现它不起作用. (5认同)
  • 通常人们定义函数来将数组和保持数组大小的整数作为两个单独的参数. (2认同)
  • @DavidPrun没有哨兵值,除非你自己把它放在那里(比如说负1).将`sizeof`作为C函数实现是不可能的,因为你缺少告诉确切大小所需的信息.此外,只要将数组传递给函数,编译器就会丢失该信息:数组参数的`sizeof`将返回相同的值,无论您实际传递的数组有多大. (2认同)

leg*_*s2k 6

我认为你总是把字符串文字与一个'\0'(null-terminator)混淆在一起.数组具有编译器1已知的编译时长度.sizeof是一个运算符,它根据数组的长度和数组的基本类型给出大小.

因此,当有人确实int a[] = {1, 2, 3};没有添加空终止字符时,编译器会将元素数量推断为3.在sizeof(int)= 4 的平台上,你将得到sizeof(a)12.

混淆是因为因为char b[] = "abc";,因为所有字符串文字都有'\0'自动放置,所以元素计数为4 即它们自动以空值终止.sizeof运营商不是对此进行检查的; 它简单地给出了4 * sizeof(char)因为sizeof所有重要的是编译时数组长度是4 = 1 +由于C中字符串文字的性质而在字符串文字中明确声明的字符数.

但是,字符串文字未初始化但具有字符文字的字符数组没有此怪癖.因此,如果char c[] = {'a', 'b', 'c'};,则sizeof(c)返回3和NOT 4,因为它不是字符串文字,并且没有空终止字符.sizeof运算符(不是函数)再次在编译时执行此演绎2.

最后,sizeof运算符本身如何实现这一点,是标准没有强制要求的实现细节.标准谈论条件和结果.如何通过实现实现它们不是标准的关注(或者除了实现它的开发人员之外的任何人).


1 C99引入了可变长度阵列(VLA),允许阵列具有动态大小.

2 仅对于VLA,sizeof运算符及其操作数在运行时进行评估