如何在sizeof运算符的帮助下初始化数组?

时间:2017-08-29 10:27:39

标签: c arrays

#include <stdio.h>
#include <stdarg.h>

int main()
{
    int x,y;

    y = sizeof(int[]){0,1,2,3,4} ;
    x = y / sizeof(1);

    printf("Number of arguments: %d", x);

    return 0;
}

此代码给出了no。数组中存在的变量。 (见变量y) 如何初始化此数组? 我认为数组是以这种方式初始化的:int a[]={variables}。 如果有更多方法来初始化阵列,请提及。

3 个答案:

答案 0 :(得分:2)

代码使用复合文字来生成“内联”(匿名)数组。

由于数组仅与sizeof一起使用,因此不会构造或初始化实际运行时数组,编译器只需检查代码并确定其类型即可在编译时完成。

快速godbolting告诉我们:

push    rbp
mov     rbp, rsp
mov     DWORD PTR [rbp-20], edi
mov     QWORD PTR [rbp-32], rsi
mov     DWORD PTR [rbp-4], 20    # Load 'y' with 20 (size of 5 ints)
mov     eax, DWORD PTR [rbp-4]
cdqe
shr     rax, 2                   # Divide by four, giving 5.
mov     DWORD PTR [rbp-8], eax
mov     eax, DWORD PTR [rbp-8]
pop     rbp
ret

顺便说一下:你在使用括号时不一致;除非参数是类型名称,否则sizeof不需要它们,因此第二次使用可能只是

x = y / sizeof 1;

这两个通常是组合在一起的,但是这里不可能,因为你的阵列是匿名的,当然。

答案 1 :(得分:1)

(int[]){0,1,2,3,4是构造数组的compound literal(在C99中引入)。这只是动态构建一个数组。

n1570-§6.5.2.5/ P3:

  

后缀表达式由带括号的类型名称后跟括号括起的初始值设定项列表组成,是一个复合文字。它提供了一个未命名的对象,其值由初始化列表给出。 99)

sizeof (int[]){0,1,2,3,4}以字节为单位给出数组(int[]){0,1,2,3,4}的大小。 sizeof (1)给出了int的大小,因此y/ sizeof (1)给出了数组中元素的数量。

答案 2 :(得分:1)

在本声明中

y=sizeof (int[]){0,1,2,3,4} ;

有两件事。第一个是使用int[]){0,1,2,3,4}类型的复合文字int[5]。它是一个未命名的整数数组。使用复合文字来从初始化器的数量中获取元素的数量。考虑到两个数组都没有创建,因为sizeof运算符不计算表达式。它只是决定了它的类型。

实际上这句话相当于

y = sizeof( int[5] );

使用复合文字只允许编译器自己计算数组中元素的数量而不是自己这样做。