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
不会受到影响。但我不知道如何纠正它。
答案 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
的第二个参数不是您想要增加的大小,而是块的当前大小加上要增加的大小。