我需要在程序的许多不同位置分配结构数组,从而将工作放在一个函数中(VS 2010)。编译器会发出有关未使用的未初始化变量的警告。那么我该如何传递它,以及如何在函数中声明它。我尝试过“&
”和“*
”的多种变体,但无济于事。
(如果我的代码导致任何形式的恶心,我事先道歉......我是英语专业。)
struct s_stream {
int blah;
};
void xxyz(void)
{
struct s_stream **StreamBuild;
char *memBlock_1;
xalloc(StreamBuild, memBlock_1, 20);
}
void xalloc(struct s_stream **StreamStruct, char *memBlock, int structCount)
{
int i = sizeof(struct s_stream *);
if ((StreamStruct=(struct s_stream **) malloc(structCount * i)) == NULL)
fatal("failed struct pointer alloc");
int blockSize = structCount * sizeof(struct s_stream);
if ((memBlock = (char *) malloc(blockSize)) == NULL)
fatal("failed struct memBlock alloc");
// initialize all structure elements to 0 (including booleans)
memset(memBlock, 0, blockSize);
for (int i = 0; i < structCount; ++i)
StreamStruct[i]=(struct s_stream *) &memBlock[i*sizeof(struct s_stream) ];
}
答案 0 :(得分:3)
我不确定我理解你的问题,但似乎你想要一个函数来创建一个动态分配的struct s_stream
个对象数组并将它们返回给调用者。如果是这样的话,那很简单:
void easiest(void)
{
struct s_stream *array = malloc(20 * sizeof(struct s_stream));
}
您可以将malloc()
移到其自己的函数中并返回指针:
void caller(void)
{
struct s_stream *array = create_array(20);
}
struct s_stream *create_array(int count)
{
return malloc(count * sizeof(struct s_stream));
}
或者如果您坚持将数组作为参数传递:
void caller(void)
{
struct s_stream *array;
create_array(&array, 20);
}
void create_array(struct s_stream **array, int count)
{
*array = malloc(count * sizeof(struct s_stream));
}
答案 1 :(得分:0)
你有没有理由不使用普通数组?例如;
struct s_stream* streamArray = malloc(sizeof(s_stream*structCount));
然后你有一个s_stream数组,你只需要使用streamArray [0]访问streamArray [structCount-1]而无需解引用任何额外的指针。
答案 2 :(得分:0)
您正在将指针memBlock_1
的副本传递给xalloc
,因此malloc
返回的地址将写入副本并且永远不会到达调用功能。由于您可能希望地址在xxyz
中memBlock_1
可用,因此您必须将指针指向char传递为第二个参数,
void xalloc(..., char **memBlock, ...)
并使用xalloc(..., &memBlock_1, ...);
进行调用。在xalloc
的正文中,将所有memBlock
替换为*memblock
,例如(*memblock = malloc(blockSize)) == NULL
(无需投射)。
类似地,StreamStruct
的{{1}}参数永远不会更改xalloc
中StreamBuild
指向指针到结构的指针s_stream。如果我正确地解释了您的意图,您还必须在该参数xxyz
中添加一个指针层,在调用中传递void xalloc(struct s_stream ***StreamStruct, ..., ...)
的地址StreamBuild
并取消引用该指针。功能体,例如xalloc(&StreamBuild, ..., ...)
。