如何增加函数参数指向的块的大小? void foo(char*p) { int i; int len=strlen(p); p=malloc(sizeof(char)*len+2); p[0]=“1”; 对于(i=1;i

如何增加函数参数指向的块的大小? void foo(char*p) { int i; int len=strlen(p); p=malloc(sizeof(char)*len+2); p[0]=“1”; 对于(i=1;i,c,pointers,malloc,C,Pointers,Malloc,您需要传递指针的地址,并将char**作为函数参数,即传递&p作为参数,并在foo中使用*p来获取数组地址。顺便说一句,需要完成数组的初始化char p[2]='1'};您的代码有一些错误之处: 在main中,将p声明为驻留在堆栈上的数组。堆栈上的内容稍后无法调整大小 然后在foo中,您希望将p更改为指向堆中的内存,而不是您声明的数组 您想要实现的是,首先使用malloc分配p,然后使用realloc重新分配内存: void foo(char *p) { int i;

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

您的代码有一些错误之处:

  • main
    中,将
    p
    声明为驻留在堆栈上的数组。堆栈上的内容稍后无法调整大小

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

您想要实现的是,首先使用
malloc
分配
p
,然后使用
realloc
重新分配内存:

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;
}
请注意,
foo
的参数是一个双指针。这是因为realloc不仅可以调整内存块的大小,还可以实际移动内存块,因此它会影响指针的值


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

+1,tho“顺便说一句,数组的初始化需要完成
charp[2]={'1'}
”。没有检查它,但我认为op所做的初始化数组如下:
char p[2]={'1','\0'}
(因此它以null结尾)。记住要小心地释放你的malloc…@downvoter:请留下评论我的答案有什么问题吗?
void foo (char **p) {
  *p = realloc(*p, 4);
}

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