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
相关产品推荐
相关产品推荐

