如何增加函数参数指向的块的大小? 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);
...
}