1
A
回答
5
形式上,它是这样完成的:
int (*arr_ptr) [x][y] = malloc(sizeof(int[x][y]));
(*arr_ptr)[i][j] = something; // access one element
free(arr_ptr);
然而,这使得元素有点不方便的访问:(*arr_ptr)[i][j]
是有点难以阅读。为了避免这方面的一个窍门,就是离开了数组指针的一个维度,而不是把它当成一维数组的数组:
int (*arr_ptr) [y] = malloc(sizeof(int[x][y]));
arr_ptr[i][j] = something; // access one element
free(arr_ptr);
如果你有一个古老的编译器,你必须创建一个更难看, “错位”二维数组:
int* ptr = malloc(sizeof(int) * x * y);
ptr[i*y + j] = something; // access one element
free(ptr);
+0
真的很酷的想法,使用像这样的可变长度数组。对于那些不知道的,“古代编译器”的意思是“C99之前的编译器”,比如MSVC。 – fuz
2
如果你的编译器支持可变长度的数组(VLA),那么你可以写下面的方式
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
size_t m = 3;
size_t n = 4;
int (*a)[n] = malloc(m * n * sizeof(int));
for (size_t i = 0; i < m; i++)
{
for (size_t j = 0; j < n; j++) a[i][j] = i * n + j;
}
for (size_t i = 0; i < m; i++)
{
for (size_t j = 0; j < n; j++) printf("%2d ", a[i][j]);
printf("\n");
}
free(a);
return 0;
}
程序输出是
0 1 2 3
4 5 6 7
8 9 10 11
否则n
必须是常数。例如
#include <stdlib.h>
#include <stdio.h>
#define N 4
int main(void)
{
size_t m = 3;
int (*a)[N] = malloc(m * N * sizeof(int));
for (size_t i = 0; i < m; i++)
{
for (size_t j = 0; j < N; j++) a[i][j] = i * N + j;
}
for (size_t i = 0; i < m; i++)
{
for (size_t j = 0; j < N; j++) printf("%2d ", a[i][j]);
printf("\n");
}
free(a);
return 0;
}
0
另一种可能性是在下面的示例中使用的一个维阵列为二维一个,如:
#include <stdio.h>
#include <stdlib.h>
#define N 2
#define M 3
/*
array has N * M elemts:
| N | N | N |
v v v v
|----|----|----|----|----|----|
array[i][j] == array[i*N + j]
*/
#define GET(i,j) (i*N + j)
int main(int argc, char **argv) {
int *array;
int i, j;
array = malloc(N * M *sizeof(int));
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
array[i*N + j] = i+j;
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
printf("array[%d][%d] = %d\n", i, j, array[i*N + j]);
printf("Using the macro:\n");
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
printf("array[%d][%d] = %d\n", i, j, array[GET(i,j)]);
free(array);
return 0;
}
我还定义了一个宏GET(i,j)
使得码会更可读性,实际上这仅仅是处理更复杂的情况,然后是二维的情况。
相关问题
- 1. 分配连续的内存到一个二维数组声明后
- 2. 连续二维数组的重新分配
- 3. 为多维数组分配内存
- 4. 分组为连续整数的范围
- 5. 动态二维数组非连续内存C++
- 6. 取消分配这个特定的二维数组的内存
- 7. 内存分配。二维数组(无效函数)
- 8. 在CUDA的设备内存上分配二维数组
- 9. Java:一维数组是否总是在内存中连续?
- 10. 是否可以将二维数组作为共享内存与IPC分配?
- 11. 在C中分配二维数组中的一维数组#
- 12. 连续的'新'操作符是否连续分配内存?
- 13. 分配和免费的二维数组
- 14. 去分配对象的二维数组
- 15. 二维数组的动态分配
- 16. 分配连续的ID,以连续的分组数据
- 17. 拆分为二维数组
- 18. 二维数组(矩阵)内存分配问题
- 19. 二维数组错误:矢量索引超出内存分配
- 20. C++:使用函数为二维数组分配内存时出错
- 21. 新[]是否连续分配内存?
- 22. 二维数组的内存问题
- 23. 在二维数组中匹配连续值
- 24. 在C的结构内包裹着指针的二维数组分配内存
- 25. 如何将值分配给动态二维数组的整行?
- 26. 这是多维数组内存空间的冗余分配吗?
- 27. 将数据分配给二维数组并显示它C
- 28. 作为结构成员内存分配的多维数组C
- 29. 堆分配一个二维数组(而不是指针数组)
- 30. C++中的二维动态内存分配数组中的空闲分配内存
乘以'M * N * sizeof(int)'并为此类内存块执行'malloc'。 M和N是每个维度中元素的数量。 – i486