В зависимости от ваших потребностей у вас есть два простых варианта:
1) Сделать статичным
void bar(const int *);
void foo() {
static int a[]={1,2,3,4,5,9};
bar(a);
}
Yields - это просто ссылка на статические данные.
foo:
.LFB0:
.cfi_startproc
movl $a.1591, %edi
jmp bar
.cfi_endproc
.LFE0:
.size foo, .-foo
.data
.align 16
.type a.1591, @object
.size a.1591, 24
a.1591:
.long 1
.long 2
.long 3
.long 4
.long 5
.long 9
Другой выбор, если вам нужны данные, которые не являются статическими или постоянными. Это иметь статические данные, а затем сделать memcpy самостоятельно, чтобы переместить их в соответствующие места. Интересно то, что gcc с оптимизацией будет использовать различные стратегии, чтобы скопировать его на место.
void bar(const int *);
void foo() {
static int s[]={1,2,3,4,5};
int a[sizeof(s)/sizeof(s[0])];
memcpy(a, s, sizeof(s));
bar(a);
}
Суть в том, что код необходим, поскольку область памяти для данных не фиксируется во время компиляции, и, следовательно, некоторый фрагмент кода должен копировать данные в память.