14

I have a function that takes a struct, and I'm trying to store its variables in array:

int detect_prm(Param prm) {
  int prm_arr[] = {prm.field1, prm.field2, prm.field3};

  return 0;
}

But with gcc -Wall -ansi -pedantic-errors -Werror I get the following error:

initializer element is not computable at load time

It looks fine to me, what's wrong?

red0ct
  • 4,840
  • 3
  • 17
  • 44
zxcv
  • 7,391
  • 8
  • 34
  • 30

2 Answers2

17

This is illegal in C. Initializer lists must be constant compile time expressions. Do the following instead:

int prm_arr[3];

prm_arr[0] = prm.field1;
prm_arr[1] = prm.field2;
prm_arr[2] = prm.field3;
Mike Thompson
  • 6,708
  • 3
  • 32
  • 39
16

Mike's answer is absolutely right.

However, if you're able to use the GNU C extensions, or to use the newer and better C99 standard instead (use the --std=c99 option), then initializers such as this are perfectly legal. The C99 standard has been out for, well, 9 years, and most C compilers support it quite well... especially this feature.

Dan Lenski
  • 76,929
  • 13
  • 76
  • 124
  • Just FYI, Visual Studio 2008 (which officially supports only C89) emits the following warning at `/W4` : `warning C4221: nonstandard extension used : 'nxstate' : cannot be initialized using address of automatic variable 'x'`. The generated assembly looks alright, though, so I'd say you can rely on this feature even in MSVC. – Daniel Kamil Kozar Oct 30 '14 at 08:21
  • 3
    Visual Studio did not officially support [C99 until 2013](http://blogs.msdn.com/b/vcblog/archive/2013/07/19/c99-library-support-in-visual-studio-2013.aspx). Only 14 years late. *bangs head* – Dan Lenski Aug 25 '15 at 19:35
  • 1
    that calls for a party! – Daniel Kamil Kozar Aug 25 '15 at 21:02