如何在函数内分配结构数组?代码以其他方式工作 [英] How can I malloc a struct array inside a function? Code works otherwise
问题描述
我正在尝试创建一个函数来创建一个可变大小的二维函数数组.我正在使用以下代码,它本身似乎可以正常工作:
I'm trying to create a function that creates a variable sized 2D funct array. I'm using the following code, which seems to work just fine on its own:
typedef struct
{
//Starter Properties
int TypeB;
int TypeF;
int TypeW;
//Randomized Properties
int RandB;
int RandF;
int RandW;
//Derived Properties
int Speed;
} MapTileData;
MapTileData **Map;
int i, x=5, y=5;
//Allocate Initial Space
Map = (MapTileData**)calloc(x, sizeof(MapTileData));
for(i = 0; i < x; i++)
{
Map[i] = (MapTileData*)calloc(y, sizeof(MapTileData));
}
所以上面的代码创建了一个二维结构体数组.我尝试将代码移动到函数中不太成功,在尝试打印数组时出现分段错误:
So the above code creates a 2D struct array. My attempts to move the code to a function have been less successful, giving segmentation faults when trying to print the array:
void CreateMap(MapTileData **Map, int xSize, int ySize)
{
//Variables
int i;
//Allocate Initial Space
Map = (MapTileData**)calloc(xSize, sizeof(MapTileData));
for(i = 0; i < xSize; i++)
{
Map[i] = (MapTileData*)calloc(ySize, sizeof(MapTileData));
}
}
在代码中使用:
MapTileData **MapTile;
CreateMap(MapTile,5,5);
非常感谢任何和所有帮助!
Any and all help is greatly appreciated!
推荐答案
C 中函数参数按值传递,在被调用者中修改参数不会影响调用者的局部变量.
Function arguments are passed by value in C and modifying arguments in callee won't affect caller's local variables.
使用指针修改调用者的局部变量.
Use pointers to modify caller's local variables.
void CreateMap(MapTileData ***Map, int xSize, int ySize)
{
//Variables
int i;
//Allocate Initial Space
*Map = calloc(xSize, sizeof(MapTileData));
for(i = 0; i < xSize; i++)
{
(*Map)[i] = calloc(ySize, sizeof(MapTileData));
}
}
代码中的用法:
MapTileData **MapTile;
CreateMap(&MapTile,5,5);
另一种方式:通过返回值传递分配的数组.
Alternate way: Pass the allocated array via the return value.
MapTileData **CreateMap(int xSize, int ySize)
{
//Variables
MapTileData **Map;
int i;
//Allocate Initial Space
Map = calloc(xSize, sizeof(MapTileData));
for(i = 0; i < xSize; i++)
{
Map[i] = calloc(ySize, sizeof(MapTileData));
}
}
代码中的用法:
MapTileData **MapTile;
Maptile = CreateMap(5,5);
另请注意,他们说您不应该转换 malloc()
及其在 C 中的家族.
Also note that they say you shouldn't cast the result of malloc()
and its family in C.
这篇关于如何在函数内分配结构数组?代码以其他方式工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!