sizeof(arr + 1)输出错误?

Wei*_*Nir 2 c

有一些我无法理解的东西c.以下代码:

#include <stdio.h>

int main(char* args){
    char abc[100];
    printf("%d %d", sizeof(abc), sizeof(abc+1));
}
Run Code Online (Sandbox Code Playgroud)

输出

100 4
Run Code Online (Sandbox Code Playgroud)

我认为它应该生成100 100-1,这是:

100 99
Run Code Online (Sandbox Code Playgroud)

同样的int abc[100].它输出

400 4
Run Code Online (Sandbox Code Playgroud)

代替

400 396
Run Code Online (Sandbox Code Playgroud)

编辑:好的,所以我看到了你的命令.表达式中的abc + 1.因此,结果是int , sizeof(int) == 4. 所以我的另一个问题是为什么我第一次发送一个数组指针,结果是数组的长度?下列:

int main(char* args){
    char abc[100];
    char *test;
    test = (char*)abc+1;
    printf("%d %d", sizeof(abc), sizeof(test));
}
Run Code Online (Sandbox Code Playgroud)

输出 100 4

Dav*_*nan 9

表达方式

abc+1 
Run Code Online (Sandbox Code Playgroud)

是一个指针.因此,您的指针似乎是4个字节宽.

另一方面,表达

abc
Run Code Online (Sandbox Code Playgroud)

是一个长度为100的char数组,因此它的大小为100.

至于使用int而不是char的版本,我相信你现在可以应用上面的推理来解释输出.


我认为你对这个问题的编辑基本上要求:

为什么是abc+1指针和abc数组.

标准说:

其他操作数 - 左值,数组和函数指示符(ISO/IEC 9899:201x 6.3.2.1/3)

除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为"array of type"的表达式转换为类型为'的表达式'指向类型'的指针,指向数组对象的初始元素,而不是左值.如果数组对象具有寄存器存储类,则行为未定义.

所以,当你写sizeof(abc)那么abc不符合的表达式转换所需要的标准abc为指针.因此abc被视为一个数组.但是在表达式中sizeof(abc+1),abc+1不符合任何列出的异常,因此被转换为指针.

通俗地说,这被称为衰减为指针的数组.


Ste*_*and 6

abc+1是一个指针; 因此它的大小是指针或地址的大小,并且4在您的系统上.

请注意,指针的大小取决于平台.正如一条评论所警告的那样:"在Windows 64上,指针大于a的大小long."

你也问为什么它首先给你100,如果它给你4后.

数组就像指针但不是指针.第一次编写时sizeof(abc),它不是编译指针的大小,而是数组的大小.这就是为什么它在第一次尝试时给你100.

  • @StephaneRolland,为了避免这个指针大小的斗争,你的答案可能是类似`abc + 1是一个指针,因此它的大小是一个指针地址的大小(在你的系统上是4个字节的表示). (2认同)