无法重新分配双指针动态内存

标签 c memory malloc realloc

我尝试在另一个方法/函数中增加双指针缓冲区。但是,分配的缓冲区的大小不会改变。这是我尝试过的代码。

#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/

相关文章:

c++ - 怎么realloc不行,malloc可以呢?

编译错误,错误如 "multiple definition"

c - 如何鼓励 C 程序中的未定义行为/乱序执行?

客户端未与服务器 C 连接(套接字编程)

c - 使用system()执行BASH脚本输出: source: not found

c++ - 防止内存碎片

python - 大pandas DataFrames上的外部合并导致MemoryError——如何与pandas进行 "big data"合并?

java - 解决 java.lang.StackOverflowError 内存问题

c - 在 c 中的数组上实现显式列表内存分配

c - 动态存储器C