我以一种智能的方式使用指向数组的指针将连续内存索引为二维数组和函数原型中的 VLA 声明符。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
#define ERR_ON(expr, msg, ...) \
do{ if(expr) { fprintf(stderr, "%d: error %s failed: " msg "\n", __LINE__, #expr, ##__VA_ARGS__); exit(-1); } }while(0)
/**
* Input: array p with x columns and y rows
* Output: int arr[y * factory][x * factorx]
* newly allocated array created from p resized by a factorx and factory
*/
void *arr2d_getenlarged(size_t x, size_t y, int p[y][x], size_t factorx, size_t factory)
{
const size_t newx = x * factorx;
const size_t newy = y * factory;
int (* const ret)[newx] = malloc(sizeof(*p) * newx * newy);
ERR_ON(ret == NULL, "");
for (size_t i = 0; i < x; ++i) {
for (size_t j = 0; j < y; ++j) {
const int val = p[i][j];
for (size_t m = 0; m < factorx; ++m) {
for (size_t n = 0; n < factory; ++n) {
ret[i * factorx + m][j * factory + n] = val;
}
}
}
}
return ret;
}
void arr2d_print(size_t x, size_t y, int (*arr)[x])
{
printf("--- %p ---\n", (void*)arr);
for (size_t i = 0; i < x; ++i) {
for (size_t j = 0; j < y; ++j) {
printf("[%d,%d]=%d ", i, j, arr[i][j]);
}
printf("\n");
}
}
int main()
{
int (*arr)[2] = malloc(sizeof(*arr) * 2);
ERR_ON(arr == NULL, "");
memcpy(arr, (int[2][2]){{0,1},{1,1}}, sizeof((int[2][2]){0}));
arr2d_print(2, 2, arr);
int (*arr3)[6] = (void*)arr2d_getenlarged(2, 2, &arr[0][0], 3, 3);
arr2d_print(6, 6, arr3);
free(arr);
free(arr3);
printf("Hello World");
return 0;
}
示例输出:
--- 0x1203010 ---
[0,0]=0 [0,1]=1
[1,0]=1 [1,1]=1
--- 0x1203030 ---
[0,0]=0 [0,1]=0 [0,2]=0 [0,3]=1 [0,4]=1 [0,5]=1
[1,0]=0 [1,1]=0 [1,2]=0 [1,3]=1 [1,4]=1 [1,5]=1
[2,0]=0 [2,1]=0 [2,2]=0 [2,3]=1 [2,4]=1 [2,5]=1
[3,0]=1 [3,1]=1 [3,2]=1 [3,3]=1 [3,4]=1 [3,5]=1
[4,0]=1 [4,1]=1 [4,2]=1 [4,3]=1 [4,4]=1 [4,5]=1
[5,0]=1 [5,1]=1 [5,2]=1 [5,3]=1 [5,4]=1 [5,5]=1
Hello World
onlinegdb 提供实时版本。