让我们考虑一下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实现的运行时部分知道此隐藏信息以返回正确的值.
我认为你总是把字符串文字与一个'\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运算符及其操作数在运行时进行评估