在函数内传递指针进行内存分配?

时间:2012-01-07 20:05:44

标签: c database malloc argument-passing

我需要在程序的许多不同位置分配结构数组,从而将工作放在一个函数中(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) ];
}

3 个答案:

答案 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返回的地址将写入副本并且永远不会到达调用功能。由于您可能希望地址在xxyzmemBlock_1可用,因此您必须将指针指向char传递为第二个参数,

void xalloc(..., char **memBlock, ...)

并使用xalloc(..., &memBlock_1, ...);进行调用。在xalloc的正文中,将所有memBlock替换为*memblock,例如(*memblock = malloc(blockSize)) == NULL(无需投射)。

类似地,StreamStruct的{​​{1}}参数永远不会更改xallocStreamBuild指向指针到结构的指针s_stream。如果我正确地解释了您的意图,您还必须在该参数xxyz中添加一个指针层,在调用中传递void xalloc(struct s_stream ***StreamStruct, ..., ...)的地址StreamBuild并取消引用该指针。功能体,例如xalloc(&StreamBuild, ..., ...)