about arrays initialization

Bob Plantz plantz@cds1.net
Sun Aug 28 02:24:00 GMT 2011


As I noted in my previous message, the right hand side must be evaluated 
before the assignment can occur. I have added comments to the assembly 
language below to show how this occurs....

On 08/27/2011 05:57 PM, uulinux wrote:
>
> Dear Maciej:
>
> Thanks very mach. I am so glad to get a replay. I seem to know what 
> you mean. The auto variable allocated from stack, whose value is 
> initialized by code in runtime, not by compiler.
>
> But look the assembler code compiled by gcc-4.4.5.
> =========================================================
>     .file    "main.c"
>     .section    .rodata
> .LC0:
>     .string    "\t%d"
>     .text
> .globl main
>     .type    main, @function
> main:
>     pushl    %ebp
>     movl    %esp, %ebp
>     andl    $-16, %esp
>     subl    $48, %esp            # allocate space for array on stack
>     movl    32(%esp), %eax       # fetch value in a[2]  (which has not 
> yet been initialized)
>     movl    24(%esp), %ecx       # fetch value in a[0]  (which has not 
> yet been initialized)
>     movl    28(%esp), %edx       # fetch value in a[1]  (which has not 
> yet been initialized)
>     leal    (%ecx,%edx), %edx    # compute a[0] + a[1]  (meaningless 
> value)
# Now the necessary arithmetic has been completed to evaluate the right 
hand side. The other three values are literals.
>     movl    $1, 24(%esp)         # a[0] = 1   (literal value, so no 
> fetching or computation needed)
>     movl    $2, 28(%esp)         # a[1] = 2   (literal value, so no 
> fetching or computation needed)
>     movl    $3, 32(%esp)         # a[2] = 3   (literal value, so no 
> fetching or computation needed)
>     movl    %eax, 36(%esp)       # a[3] = a[2]   (previously computed 
> above]
>     movl    %edx, 40(%esp)       # a[4] = a[0] + a[1]   (previously 
> computed above]
>     movl    $0, 44(%esp)         # a[5] = 0
>     movl    $0, 44(%esp)         # a[5] = 0
# I have no idea why 0 is stored beyond the end of the array or why it 
is done twice. But the
# assignment to the elements of the array occur as I have always 
expected in C.
>     jmp    .L2
> .L3:
>     movl    44(%esp), %eax
>     movl    24(%esp,%eax,4), %edx
>     movl    $.LC0, %eax
>     movl    %edx, 4(%esp)
>     movl    %eax, (%esp)
>     call    printf
>     addl    $1, 44(%esp)
> .L2:
>     cmpl    $4, 44(%esp)
>     jle    .L3
>     movl    $10, (%esp)
>     call    putchar
>     movl    $0, %eax
>     leave
>     ret
>     .size    main, .-main
>     .ident    "GCC: (Gentoo 4.4.5 p1.2, pie-0.4.5) 4.4.5"
>     .section    .note.GNU-stack,"",@progbits
> =========================================================
>    Please notice this code compiled from "int a[5] = [1, 2, 3, a[2], 
> a[0]+a[1]]":
>     movl    $1, 24(%esp)
>     movl    $2, 28(%esp)
>     movl    $3, 32(%esp)
>     movl    %eax, 36(%esp)
>     movl    %edx, 40(%esp)
>    I just doubt whether there is something wrong or not very good. I 
> expect code as following:
>     movl    $1, 24(%esp)
>     movl    $2, 28(%esp)
>     movl    $3, 32(%esp)
>     movl    32(%esp), %eax
>     movl    %eax, 36(%esp)
>     movl    24(%esp), %edx
>     movl    28(%esp), %eax
>     leal    (%edx,%eax), %eax
>     movl    %eax, 40(%esp)
>    And I expect "int a[5] = [1, 2, 3, a[2], a[0]+a[1]]" is equivalent to:
>         int a[5] = [1, 2, 3];
>         a[3] = a[2];
>         a[4] = a[0]+a[1];
>    If the array is global variable and which will be put in .data 
> segment by compiler, gcc-4.4.5 will report error as following. But I 
> think this kind method of initialization is useful.
> =========================================================
> localhost array # gcc -o main main.c
> main.c:28: error: initializer element is not constant
> main.c:28: error: (near initialization for 'a[3]')
> main.c:28: error: initializer element is not constant
> main.c:28: error: (near initialization for 'a[4]')
> =========================================================



More information about the Gcc-help mailing list