我需要在程序中的一堆不同位置分配结构数组,从而将工作放入函数中(VS 2010)。编译器对使用的未初始化变量发出警告。那么我该如何传递它,以及如何在函数中声明它。我尝试过"&
"one_answers"*
"的许多变体,但都没有成功。
(如果我的代码引起任何形式的恶心,我提前道歉……我是英语专业的。)
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) ];
}
我不确定我是否完全理解您的问题,但您似乎想要一个函数,该函数将创建一个动态分配的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));
}
您正在将指针memBlock_1
的副本传递给xalloc
,因此malloc
返回的地址将写入副本,并且永远不会到达调用函数。由于您可能希望memBlock_1
中的xxyz
可以使用该地址,因此必须传递一个指向char的指针作为第二个参数
void xalloc(..., char **memBlock, ...)
并用CCD_ 10进行调用。在xalloc
的主体中,用*memblock
替换所有出现的memBlock
,例如(*memblock = malloc(blockSize)) == NULL
(无需强制转换)。
类似地,xalloc
的StreamStruct
参数从未将StreamBuild
指针更改为指向xxyz
中结构s_stream的指针。如果我正确解释了您的意图,您还必须为参数void xalloc(struct s_stream ***StreamStruct, ..., ...)
添加一个指针层,在调用中传递StreamBuild
的地址xalloc(&StreamBuild, ..., ...)
,并在函数体中取消引用指针,例如(*StreamStruct = malloc(structCount * i)) == NULL
。
不使用正则数组有什么原因吗?例如
struct s_stream* streamArray = malloc(sizeof(s_stream*structCount));
然后,您可以使用streamArray[0]到streamArray[structCount-1]访问s_stream数组,而无需取消引用任何额外的指针。