c-在函数内部传递内存分配指针



我需要在程序中的一堆不同位置分配结构数组,从而将工作放入函数中(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(无需强制转换)。

类似地,xallocStreamStruct参数从未将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数组,而无需取消引用任何额外的指针。

相关内容

  • 没有找到相关文章

最新更新