Я запутался в том, допустимо ли (в C) передавать указатель на массив, который был инициирован следующим образом (например, во время компиляции в стеке):
int a[] = {1, 2, 3};
my_func(&a);
void my_func(int **a)
{
int *tmp = *a; /* this statement fixes the problem */
printf("%d %d %d", (*a)[0], (*a)[1], (*a)[2]); /*doesn't work */
printf("%d %d %d", tmp[0], tmp[1], tmp[2]); /*does work */
}
когда я делаю это с помощью gdb, я не могу «увидеть» ни одно из значений (* a) [0] и т. Д. Изнутри my_func. например,
(gdb) p (*a)[0]
Cannot access memory at address 0x0
Я думаю, что, возможно, у меня есть фундаментальное недопонимание относительно того, что вы можете и не можете делать с массивами, которые находятся в стеке, а не в куче?
Я надеюсь, что это не так, поскольку мои модульные тесты очень удобны для объявления массивов в стеке, как в примере, но мне нужно протестировать функции, которые ожидают указатели на указатели на int.
Заметьте, я получаю предупреждение компилятора следующим образом:
test_utility.c:499:5: warning: passing argument 1 of ‘int_array_unique’ from incompatible pointer type [enabled by default]
../src/glamdring2.h:152:5: note: expected ‘int **’ but argument is of type ‘int (*)[12]’
но я думал, что будет хорошо смешать int *a[]
с **a
? Возможно нет? Разве они не эквивалентны?