我尝试在另一个方法/函数中增加双指针缓冲区。但是,分配的缓冲区的大小不会改变。这是我尝试过的代码。
#include <stdio.h>
#include <stdlib.h>
void change_buffer_size(char ** buffer)
{
*buffer = realloc(*buffer, sizeof(char) * 2);
}
int main()
{
char **buffer = malloc(sizeof(char) * 1);
*buffer[0] = 'H';
change_buffer_size(buffer);
*buffer[1] = 'i';
printf("%s\n", *buffer);
return 0;
}
我收到段错误(核心转储)
错误。
最佳答案
char **buffer = malloc(sizeof(char) * 1);
这是错误的。您现在有一个 char**
,因此它指向的内容是一个 char*
,但其中只有足够的空间容纳 char
>。您还只分配了一层双指针。
*buffer[0] = 'H';
由于上述问题,该行导致了段错误。它正在尝试写入内存中未定义的位置。
解决此问题的最佳方法是正常分配第一层,必要时使用 &
,并且仅对第二层使用 malloc
。
此外,%s
在看到空字节之前不会停止写入,因此您需要分配并写入其中一个字节。以下是解决所有问题的方法:
#include <stdio.h>
#include <stdlib.h>
void change_buffer_size(char ** buffer)
{
*buffer = realloc(*buffer, sizeof(char) * 3);
}
int main()
{
char *buffer = malloc(sizeof(char) * 1);
buffer[0] = 'H';
change_buffer_size(&buffer);
buffer[1] = 'i';
buffer[2] = '\0';
printf("%s\n", buffer);
return 0;
}
关于无法重新分配双指针动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59587460/