在c中传递和分配指向void *的指针

时间:2016-08-27 09:18:31

标签: c void-pointers generic-programming

我在c中使用了函数指针来创建一个通用结构。 当我调用特定函数时,其中一个参数是输出参数。我在特定函数内部分配内存,但它不起作用。我会喜欢一些帮助!

typedef void *PhaseDetails;
typedef Result (*Register)(const char *, PhaseDetails *);

Result Func(const char *file, Register register1){
    PhaseDetails firstPhase = NULL;
    Result res = register1(file, &firstPhase);
}

int main() {
    OlympicSport os = Func("men100mList.txt", (Register) registerMen100m);
    return 0;
}

Result registerMen100m(const char *file,
    Men100mPhaseDetails *firstPhase) {
    firstPhase = malloc(sizeof(*firstPhase));
    if (firstPhase == NULL) {
        return OG_MEMORY_ALLOCATION_FAILED;
    }
    *firstPhase = malloc(sizeof(**firstPhase));
    (*firstPhase)->phaseName = malloc(sizeof(char)*12);
    return OG_SUCCESS;
}

问题是firstPhase返回NULL

1 个答案:

答案 0 :(得分:0)

问题是您将firstPhase(在Func()中定义)的指针传递到firstPhase函数的registerMen100m()参数中,但是,作为函数中的第一件事,用新分配的内存块的地址覆盖它。

之后,firstPhase函数中Func()的值不会,也不能从registerMen100m()

中更改
Result registerMen100m(const char *file, Men100mPhaseDetails *firstPhase)
{
  /* At this point, firstPhase holds the address of the variable
  ** 'firstPhase' you defined in the 'Func()' function.
  */
  firstPhase = malloc(sizeof(*firstPhase));
  /* And now it doesnt! So you will never be able to get anything back
  */

  if (firstPhase == NULL) {return OG_MEMORY_ALLOCATION_FAILED;}

  /* The result of the following malloc is stored in the memory space you
  ** allocated earlier! If you remove the two lines above you 
  ** should most probably get what you wanted.
  */
  *firstPhase = malloc(sizeof(**firstPhase));
  (*firstPhase)->phaseName = malloc(sizeof(char)*12);
  return OG_SUCCESS;
}

作为一个使用相同名称的一般性评论只有在任何地方都意味着相同的意义才有意义。在这里,firstPhase在两个不同的函数中有两个不同的含义,这很难说明发生了什么。 此外,将函数作为参数传递是您很少需要的。您有这样的方式构建程序的具体原因吗?