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

C语言链表新增节点如何实现不同字符串的输入与存储

问题原因及修复方案

原有代码存在的核心问题

你遇到的所有节点字符串被最后一次输入覆盖的问题,根源是代码存在3处关键错误:

  • 节点内存分配错误:malloc(sizeof(struct node*)) 仅分配了指针大小的内存,远小于struct node结构体本身的实际大小,属于内存分配越界的未定义行为。
  • 字符串指针未分配有效内存:结构体成员s是未初始化的野指针,直接调用scanf向其指向的非法地址写入数据,大概率所有节点的s碰巧指向了同一块临时可写内存,因此每次输入都会覆盖之前的内容。
  • main函数中调用的函数名和实际定义的getstring不匹配,属于笔误。

修复方法

  1. 修正节点内存分配的大小,改为分配完整的struct node大小
  2. 为每个节点的字符串成员s单独分配足够的内存,再写入用户输入的内容,确保每个节点的字符串存储在独立的内存空间
  3. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:45:04