2017-08-29 91 views
0
#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}。 如果有更多的方法来初始化数组请提及。如何在sizeof运算符的帮助下初始化数组?

+0

请参阅https://stackoverflow.com/questions/3137671/declaring-and-initializing-arrays-in-c –

回答

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; 

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

+4

围绕'sizeof'(表达式)的括号是风格问题。我总是把它们。 –

+0

我的问题是array(int [])是如何用值(0,1,2,3,4)初始化的。我还没有看到这种初始化方式。 –

+0

@BasileStarynkevitch当然。有些人也用'return'来使用它们,但我喜欢在可能的情况下尽量说明语言是如何工作的,我有一种感觉,在这些东西周围有很多货物喋喋不休,我觉得很烦人。 – unwind

1

(int[]){0,1,2,3,4compound 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)给出了数组中元素的数量。

+0

谢谢,我不知道这一点。 –

1

在这份声明中

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

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

其实这种说法是相当于

y = sizeof(int[5]); 

使用文字的化合物,只是让编译器本身来计算元素的数量阵列中,而不是由你这样做你自己。

+0

它实际上*是否创建一个文字? 'sizeof'不评估... –

+0

@AnttiHaapala好评。我没有考虑到使用sizeof运算符。我会更新我的帖子:) –

+0

虽然,我猜这两种方式都没有要求,所以也可以创建它。 –