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

C语言中char pointer返回值被覆盖问题:如何保存输入内容

解决C语言中get_input()返回static数组导致内容被覆盖的问题

你遇到的核心问题是static数组的内存地址固定,每次调用都会复用同一块空间,所以所有结构体指针都会指向同一个内存区域,新输入自然会覆盖旧内容。以下是几种可行的解决方法:

方法1:动态分配独立内存

在get_input()中为每次输入分配新的堆内存,将输入内容拷贝到新内存后返回指针。这样每个结构体的指针都会指向独立的内存块,不会互相覆盖。

示例代码:

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

char* get_input() {
    // 临时缓冲区存储输入(static仅作临时使用,不影响最终返回的独立内存)
    static char temp_buf[256];
    if (fgets(temp_buf, sizeof(temp_buf), stdin) == NULL) {
        return NULL; // 处理输入失败的情况
    }
    // 去掉fgets读取到的换行符
    temp_buf[strcspn(temp_buf, "\n")] = '\0';
    // 分配足够存储输入内容的内存(+1是为了存字符串结束符'\0')
    char* input_str = malloc(strlen(temp_buf) + 1);
    if (input_str != NULL) {
        strcpy(input_str, temp_buf);
    }
    return input_str;
}

注意:使用完这些动态分配的内存后,必须用free()手动释放,否则会造成内存泄漏。比如销毁结构体或链表节点时,要先free(ticket->name),再free(ticket)。

方法2:由调用者提供缓冲区

让get_input()接收调用者传入的缓冲区和大小,直接将输入写入到调用者指定的内存中。这种方式不需要动态分配,内存由调用者管理,更安全。

示例代码:

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

void get_input(char* buf, size_t buf_size) {
    if (buf == NULL || buf_size == 0) {
        return;
    }
    fgets(buf, buf_size, stdin);
    buf[strcspn(buf, "\n")] = '\0';
}

对应的结构体可以定义为固定大小的字符数组:

typedef struct {
    char priority[32];
    char name[256];
    // 其他字段
} TroubleTicket;

调用方式:

TroubleTicket tickets[10];
get_input(tickets[0].priority, sizeof(tickets[0].priority));
get_input(tickets[0].name, sizeof(tickets[0].name));

这种方式每个结构体的字段都有独立的内存空间,完全不会出现覆盖问题,也不用操心内存释放。

方法3:适配后续链表的方案

如果你后续要改用链表,推荐结合方法1:链表节点本身用malloc()动态分配,节点内的字符串指针也用方法1的动态分配方式。示例:

typedef struct TicketNode {
    char* priority;
    char* name;
    struct TicketNode* next;
} TicketNode;

// 创建新节点
TicketNode* create_ticket() {
    TicketNode* node = malloc(sizeof(TicketNode));
    if (node == NULL) {
        return NULL;
    }
    node->priority = get_input(); // 用方法1的get_input
    node->name = get_input();
    node->next = NULL;
    return node;
}

销毁链表时,要逐层释放:

void free_ticket_list(TicketNode* head) {
    TicketNode* temp;
    while (head != NULL) {
        temp = head;
        head = head->next;
        free(temp->priority);
        free(temp->name);
        free(temp);
    }
}

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:35:59