Знам, че това е стар кестен, но искам малък 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 **
, без да се налага да минавам през всички модата на циклите for или копирането на статично разпределения масив в динамично разпределен.
Ще свърши ли работа следното?
int *A0 = { 1, 2 };
int *A1 = { 3, 4 };
int *A2 = { 5, 6 };
int **A = { A0, A1, A2 };
Има ли по-хубав начин от този да го направите?
Благодаря на всички.
P.s. Знам, че в реалния живот бихме прочели стойности от DB или файл в динамично разпределени масиви и избягвахме всички тези неща.