C语言链表新增节点如何实现不同字符串的输入与存储
问题原因及修复方案
原有代码存在的核心问题
你遇到的所有节点字符串被最后一次输入覆盖的问题,根源是代码存在3处关键错误:
- 节点内存分配错误:
malloc(sizeof(struct node*))仅分配了指针大小的内存,远小于struct node结构体本身的实际大小,属于内存分配越界的未定义行为。 - 字符串指针未分配有效内存:结构体成员
s是未初始化的野指针,直接调用scanf向其指向的非法地址写入数据,大概率所有节点的s碰巧指向了同一块临时可写内存,因此每次输入都会覆盖之前的内容。 - main函数中调用的函数名和实际定义的
getstring不匹配,属于笔误。
修复方法
- 修正节点内存分配的大小,改为分配完整的
struct node大小 - 为每个节点的字符串成员
s单独分配足够的内存,再写入用户输入的内容,确保每个节点的字符串存储在独立的内存空间 - 修正main函数中的函数调用名,和定义的
getstring保持一致
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> struct node { char *s; struct node *next; }; struct node* getstring(struct node *tail) { // 修正节点内存分配大小 struct node *ptr = (struct node*)malloc(sizeof(struct node)); // 为字符串单独分配内存,按原有%2s的限制分配3字节(2个有效字符+结束符) // 如果需要支持更长输入,可调整分配大小和scanf的格式化字符限制 ptr->s = (char*)malloc(3 * sizeof(char)); printf("Enter the string:"); scanf("%2s",ptr->s); ptr->next = NULL; tail->next = ptr; tail = ptr; return tail; } int main() { struct node *head = malloc(sizeof(struct node)); head->s = "Operating system"; head->next = NULL; struct node *tail; tail = head; // 修正函数调用名 tail = getstring(tail); tail = getstring(tail); struct node *temp = head; while(temp!=NULL) { printf("%20s\n",temp->s); temp = temp->next; } // 内存释放逻辑,避免内存泄漏 temp = head; while(temp!=NULL) { struct node *next = temp->next; // 头节点的s指向字符串常量,不需要单独释放 if (temp != head) { free(temp->s); } free(temp); temp = next; } return 0; }
内容的提问来源于stack exchange,提问作者Tharindu
相关产品推荐
相关产品推荐

