#include <stdio.h>
#include <stdlib.h>

enum{DIM=3};

int zugriff1(int(*a)[DIM],int x,int y)
{
/* bei zur Compilezeit bekannter Spaltendimension kann der Typ diese Info liefern */
	return a[x][y]; 
}

int zugriff2(void*i,int dim,int x,int y)
{
/* bei erst zur Laufzeit bekannter Spaltendimension Nutzung von Zeiger auf VLA + compound literal */
	return (int(*)[dim]){i}[x][y];
}

int main() {
	/* Spaltendimension DIM ist (Compilezeit)konstant */
	int a[DIM][DIM];
	for(int j=0;j<DIM;++j)for(int k=0;k<DIM;++k) a[j][k]=j*k;
	
	for(int j=0;j<DIM;++j,puts(""))for(int k=0;k<DIM;++k)
		printf("%d ",zugriff1(a,j,k)); /* hier keine Spaltendimension nötig, da im Typ vorhanden */
	
	/* Spaltendimension ist jetzt dynamisch */
	int d = DIM;
	int *i=malloc(d*d*sizeof*i);
	for(int j=0;j<d;++j)for(int k=0;k<d;++k) i[j*d+k]=j*k;
	
	for(int j=0;j<d;++j,puts(""))for(int k=0;k<d;++k)
		printf("%d ",zugriff2(i,d,j,k));
	
	free(i);
	return 0;
}
