sizeof(arr + 1)输出错误?

时间:2013-12-07 18:23:03

标签: c

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

#include <stdio.h>

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

输出

100 4

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

100 99

int abc[100]相同。 它输出

400 4

而不是

400 396

编辑: 好的,所以我看到了你的命令。表达式中的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));
}

输出 100 4

4 个答案:

答案 0 :(得分:9)

表达式

abc+1 

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

另一方面,表达式

abc

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

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


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

  

为什么abc+1是指针,abc是数组。

标准说:

  

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

     

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

因此,当您编写sizeof(abc)时,abc不符合将表达式abc转换为指针所需的条件。所以abc被视为一个数组。但是在表达式sizeof(abc+1)中,abc+1不符合任何列出的异常,因此转换为指针。

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

答案 1 :(得分:6)

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

请注意,指针的大小取决于平台。 正如一条评论警告:“在Windows 64上,指针大于long的大小。”

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

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

答案 2 :(得分:1)

这很好。

由于数组的名称是只读指针,它指的是数组中第一个元素的地址。 每当可行算术运算符(++, - ,+, - ) 返回应用于数组时,它将被视为< EM>指针。

sizeof 是一个运算符,它返回类型或变量或文字的块大小(以字节为单位)

当你使用 sizeof(数组)
时 它返回100.
因为数组的块大小是100 你没有应用任何算术,所以数组被视为数组

当你使用 sizeof(array + 1)
时 它返回4(机器中指针的大小) 它被视为指针,因为应用了算术运算,指针的块大小相当于大小(可能会有所不同)

答案 3 :(得分:0)

我的第二个问题的答案是sizeofcompiler time operator。 因此,他知道定义数组的大小,如char abc[100];但他并不真正知道指向数组的指针的大小。像char *test = abc;我的意思是数组的长度不会保存在内存中。