如何在函数内部使用malloc并在C中返回指针?

时间:2012-10-09 00:54:56

标签: c function malloc

下面是一些psudo,但我正在努力实现这一目标。问题是写的,它返回一个空白指针。

int testFunction(char *t) {
    int size = 100;
    t = malloc(100 + 1);
    t = <do a bunch of stuff to assign a value>;
    return size;
}

int runIt() {
    char *str = 0;
    int str_size = 0;
    str_size = testFunction(str);
    <at this point, str is blank and unmodified, what's wrong?>
    free(str);
    return 0;
}

如果我有一个预定义的大小,例如 char str [100] =“”,并且我不尝试malloc或释放内存后记录,这可以正常工作。我需要能够使尺寸变得动态。

我也试过这个,但似乎不知何故遇到了一个腐败的指针。

int testFunction(char **t) {
    int size = 100;
    t = malloc(100 + 1);
    t = <do a bunch of stuff to assign a value>;
    return size;
}

int runIt() {
    char *str = 0;
    int str_size = 0;
    str_size = testFunction(&str);
    <at this point, str is blank and unmodified, what's wrong?>
    free(str);
    return 0;
}

谢谢!

3 个答案:

答案 0 :(得分:7)

您的测试功能有点落后。大小应为输入。分配的指针应该是输出

char* testFunction(int size) {
    char* p = malloc(size);
    <do a bunch of stuff to assign a value>;
    return p;
}

int runIt() {
    char *str = 0;
    int str_size = 100;
    str = testFunction(str_size);
    <do something>
    free(str);
    return 0;
}

修改

根据评论,也将尺寸作为输出。

char* testFunction(int *size) {
    *size = <compute size>;
    char* p = malloc(size);
    <do a bunch of stuff to assign a value>;
    return p;
}

int runIt() {
    char *str = 0;
    int str_size;
    str = testFunction(&str_size);
    <do something>
    free(str);
    return 0;
}

答案 1 :(得分:4)

你差不多第二个例子,但改变了

int testFunction(char **t) {
  ...
  t = malloc(100 + 1);

int testFunction(char **t) {
  ...
  *t = malloc(100 + 1);

关键是你要传入char**,一个指向指针的指针,所以你想把malloc分配给指向的东西(指针)。

答案 2 :(得分:0)

我也在学习c ++。我有一个相同的问题。所以在与工作中的c ++专家交谈之后,他建议我做这样的事情

int method(char* p) {                 
  if (p) {
    strcpy(p, "I like c++");
  }
  return strlen("I like c++");
}

int main()
{
      char* par = NULL;
      int len = method(par);

      if (len > 0) {
          par = (char*)malloc(len+1);
          memset(par, 0, len + 1);
          method(par);
          cout << "ret : " << par;
      }

      free(par);
}