Я знаю, что это старый каштан, но я хочу, чтобы в моем коде был статически выделен небольшой 2D-массив. Я знаю, как это сделать:
static int A[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
Это нормально, и я могу получить доступ ко всем его членам. Однако у меня есть несколько проблем с передачей его функции, например:
void print_matrix(int **a, int r, int c)
{
int x, y;
for(x = 0; x < r; x++)
{
printf("Row %02d = %#x = ", x, a[x]);
for(y = 0; y < c; y++)
{
printf("%s%d", (0 == y) ? "" : ", ", a[x][y]);
}
printf("\n");
}
}
Во-первых, я не могу просто передать A
в функцию, мне нужно привести его к (int **). Поскольку char *
является синонимом char []
, меня это немного удивило. Во-вторых, происходит сбой, и когда я проверяю отладчик, внутри подфункции a[0]
сообщается как 1
, а не как указатель на массив целых чисел.
Я знаю, что здесь происходит тайная магия компилятора/языка C. Но все это немного запутанно. Если я попытаюсь инициализировать как:
static int *A[3] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
Я получаю тонну предупреждений. Чем это отличается от:
static char *S[3] = { "hello", "there", "stackoverflow" };
Помимо вопроса о тайной магии C, которую я почему-то никогда не изучал, несмотря на более чем десятилетие программирования на C :(, я хотел бы знать, как сгенерировать свой массив, чтобы я мог успешно передать его как int **
без необходимости проходить через все fag циклов for или копирование статически выделенного массива в динамически выделенный.
Будет ли работать следующее?
int *A0 = { 1, 2 };
int *A1 = { 3, 4 };
int *A2 = { 5, 6 };
int **A = { A0, A1, A2 };
Есть ли более приятный способ сделать это?
Спасибо всем.
P.S. Я знаю, что в реальной жизни мы бы считывали значения из БД или файла в динамически выделяемые массивы и избегали всего этого.