Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将malloc()转换为非默认类型的多维数组?_C_Arrays_Multidimensional Array_Malloc - Fatal编程技术网

如何将malloc()转换为非默认类型的多维数组?

如何将malloc()转换为非默认类型的多维数组?,c,arrays,multidimensional-array,malloc,C,Arrays,Multidimensional Array,Malloc,我有以下描述游戏板的数组: square * board = (square *)malloc(sizeof(square)*n*n); 我如何初始化这样一个数组,使其元素指向上述声明中的其他游戏板 也就是说,我想初始化整个板数组的切片;像这样(伪代码): 我必须使用malloc() 我已经试过这样做: square (*t_board)[11]; t_board = malloc(sizeof(player)*n*n*11); 但是我得到了一个错误:“使用未声明的标识符‘t_board’

我有以下描述游戏板的数组:

square * board = (square *)malloc(sizeof(square)*n*n);
我如何初始化这样一个数组,使其元素指向上述声明中的其他游戏板

也就是说,我想初始化整个
数组的切片;像这样(伪代码):

我必须使用
malloc()

我已经试过这样做:

square (*t_board)[11]; 
t_board = malloc(sizeof(player)*n*n*11);

但是我得到了一个错误:“使用未声明的标识符‘t_board’;你是说‘board’?”

首先为带有指针的数组分配内存,然后再为这些板分配内存

square **boards;
int nbr_boards = 5;
int n = 24;

//Allocate space for pointers
boards = malloc(nbr_boards * sizeof *boards);

//Allocate space for each board
for (int i = 0; i < nbr_boards; ++i)
        boards[i] = malloc(n * n sizeof **boards);
要在以后释放它,您必须再次循环指针:

for (int i = 0; i < nbr_boards; ++i)
        free(boards[i]);
free(boards);
用于(int i=0;i
无论类型如何,分配
N
x
N
数组都采用以下形式之一:

如果编译时知道
N
,或者支持可变长度数组,则很容易:

T (*arr)[N] = malloc( sizeof *arr * N );
元素的访问方式为
arr[i][j]
。当你完成后,你会把它们作为

free( arr );
如果编译时不知道
N
,并且不支持VLA,并且所有数组元素必须是连续的,则需要分配1D数组并计算偏移量:

T *arr = malloc( sizeof *arr * N * N );
...
x = arr[ i * N + j ];
如果数组元素不必是连续的,则可以执行分段分配:

T *arr = malloc( sizeof *arr * N );
if ( arr )
{
  for ( size_t i = 0; i < N; i++ )
  {
    arr[i] = malloc( sizeof *arr[i] * N );
  }
}
如果要将数组元素初始化为all-bits-0,请使用
calloc
而不是
malloc

T (*arr)[N] = calloc( N, sizeof *arr );
如果要将数组元素初始化为除所有位零之外的其他值,则这取决于
T
的外观。如果
T
是一个包含两个整数元素的结构类型,并且您使用的是C99或更高版本的编译器,那么您可以将复合文本与
memcpy
结合使用:

memcpy( arr[i], ( struct foo [] ){ {1,2}, {3,4}, {5,6}, {7,8} ... } );

那很好。你有问题吗?谢谢你的编辑,如果你有类似的帖子@AmitSharma,请发一个anwser,我已经看过了,它没有帮助我思考“非默认类型”是什么意思?+1写下了我会的答案-节省了我的时间。小风格创意:可能
malloc(N*sizeof*arr)
vs.
malloc(sizeof*arr*N)
因为它匹配
nmemb,size
calloc(N,sizeof*arr)
的顺序。当然,无论产品是如何形成的,
malloc()
都会产生相同的分配结果。
for ( size_t i = 0; i < N; i++ )
  free( arr[i] );
free( arr );
T (*arr)[N] = calloc( N, sizeof *arr );
memcpy( arr[i], ( struct foo [] ){ {1,2}, {3,4}, {5,6}, {7,8} ... } );