You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用malloc创建双指针临时字符串数组时出现覆盖问题求助

问题分析与修复:字符串被覆盖的原因

你的代码核心问题是所有指针都指向了同一块栈内存:

  • 你声明的buffer[10]是栈上的固定数组,每次调用fgets都会把新输入的内容写入这块内存,覆盖之前的数据。
  • *(input+i) = buffer;这行代码只是把buffer的地址赋值给input数组的每个元素,并没有复制字符串内容。所以最后input里的5个指针全指向同一个buffer,自然输出的都是最后一次输入的内容。

修复方案1:为每个字符串单独分配堆内存并复制内容

利用strdup(或者手动malloc+strcpy)为每个输入的字符串分配独立的内存空间,确保每个指针指向不同的内存块:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    char** input = malloc(5 * sizeof(char*));
    char buffer[10];

    for (int i = 0; i < 5; i++)
    {
        fgets(buffer, 10, stdin);
        // strdup自动分配内存并复制字符串
        input[i] = strdup(buffer);
        // 如果编译器不支持strdup,用下面两行替代:
        // input[i] = malloc(strlen(buffer) + 1);
        // strcpy(input[i], buffer);
        printf("%s", input[i]);
    }

    for (int i = 0; i < 5; i++)
    {
        printf("%s", input[i]);
        free(input[i]); // 逐个释放字符串内存
    }
    free(input); // 释放指针数组本身
    printf("\n");
    return 0;
}

修复方案2:直接为每个指针分配独立的输入缓冲区

跳过中间的buffer,直接给input的每个元素分配内存,让fgets直接写入堆内存:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    char** input = malloc(5 * sizeof(char*));

    for (int i = 0; i < 5; i++)
    {
        input[i] = malloc(10 * sizeof(char)); // 每个元素分配10字节缓冲区
        fgets(input[i], 10, stdin);
        printf("%s", input[i]);
    }

    for (int i = 0; i < 5; i++)
    {
        printf("%s", input[i]);
        free(input[i]);
    }
    free(input);
    printf("\n");
    return 0;
}

额外提醒

  1. 使用堆内存后,必须对应调用free释放,否则会造成内存泄漏。
  2. fgets会把输入的换行符也读入字符串,如果不需要换行符,可以用buffer[strcspn(buffer, "\n")] = '\0';手动截断。

内容的提问来源于stack exchange,提问作者João Victor Velasco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:55:20