如何增加函数参数指向的块的大小?

时间:2011-02-26 08:20:09

标签: c pointers malloc

void foo(char *p)  
{  
    int i;
    int len = strlen(p);
    p = malloc(sizeof(char)*len+2);
    p[0] = '1';
    for(i=1; i<len+1; i++)
        p[i] = '0';
    p[i] = '\0';
}  

int main()  
{
    char p[2] = "1";

    foo(p);
    printf("%s\n", p);  // "10" expected

    return 0;
}

我意识到当我在malloc中调用foo时,p的值已经更改,因此main中的数组p不会受到影响。但我不知道如何纠正它。

2 个答案:

答案 0 :(得分:2)

您需要传递指针的地址并将char**作为函数参数,即将&p作为参数传递,并使用*p内的foo来获取数组地址。顺便说一句,数组的初始化需要完成char p[2] = {'1'};

答案 1 :(得分:2)

您的代码有一些错误:

  • main中,您将p声明为驻留在堆栈上的数组。堆栈中的东西以后不能调整大小。

  • 然后在foo中,您希望将p更改为指向堆中的内存而不是您声明的数组。

您希望通过最初使用p分配malloc,然后使用realloc重新分配该内存来完成您想要实现的目标:

void foo (char **p) {
  *p = realloc(*p, 4);
}

int main (void) {
  char *p = malloc(2);
  foo(&p);
  ...
}

请注意foo的参数是双指针。这是因为realloc不仅可以调整内存块的大小,而且实际上也可以移动它,因此它会影响指针的值。

另请注意,realloc的第二个参数不是您想要增加的大小,而是块的当前大小加上要增加的大小。