2

下面是一些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;
}

谢谢!

4

3 回答 3

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;
}
于 2012-10-09T00:57:54.183 回答
4

第二个例子你快到了,但是改变

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

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

关键是您要传入 a char**,一个指向指针的指针,因此您希望将 malloc 分配给指向的内容(指针)。

于 2012-10-09T00:58:46.943 回答
0

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

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);
}
于 2017-03-06T11:55:08.793 回答