Self-referring const array initialisation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi there

Here is a test program to illustrate a problem in some code
I have inherited:

#include <stdio.h>

const int array1[5]=
{
  1,
  2,
  3,
  4,
  5
};

const int array2[5]=
{
  1,
  array2[0] + 1,
  array2[1] + 1,
  array2[2] + 1,
  array2[3] + 1,
};

int main()
{
  printf ("Array values:\n\n");
  printf("array1  array2\n");

  printf("  %i       %i\n", array1[0], array2[0]);
  printf("  %i       %i\n", array1[1], array2[1]);
  printf("  %i       %i\n", array1[2], array2[2]);
  printf("  %i       %i\n", array1[3], array2[3]);
  printf("  %i       %i\n", array1[4], array2[4]);
}


If I build and run this on a Sun/Sparc/Solaris system using
gcc version 2.95.2, I get the following output:

Array values:

array1  array2
  1       1
  2       2
  3       3
  4       4
  5       5


However, if I use gcc version 3.3.2, I get this output:

Array values:

array1  array2
  1       1
  2       1
  3       1
  4       1
  5       1


A bit of investigation with the debugger revealed that the
initialisation code is producing the initialised array on the
stack, then copying it to its normal position in RAM. Unfortunately,
the initialisation code is reading values from the array's normal
position in RAM, so reads a zero for the array elements already
initialised instead of the initialised value.

My question is whether this sort of self-reference is allowed by
the C and/or C++ standards. In other words, is this a compiler bug,
or a bug in the above code?

Cheers,
Ian.

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux