c - C 中的链表、结构的结构、段错误

标签 c struct linked-list segmentation-fault

我正在尝试用c语言实现一个火车结构。我有一个名为转向架的结构和另一个称为链接转向架的结构。我在如何在代码中引用这些结构的所有组件时遇到问题。 我的主要问题是:

-我在输入转向架类型时遇到段错误

-转向架尺寸为何为28? (字符(1)+数组(20)+int(4)=25)

- 我想确认结构内部是否有结构,当我创建外部结构的实例时,我需要为每个内部结构进行 malloc 吗?无论如何,要使其自动化。

-我的代码是否过于复杂化了?有没有更简洁的方法来编写这个?

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

typedef struct
{
    char name;
    char type[20];
    int capacity;
}BOGIE;

struct LINKED_BOGIE
{
    BOGIE* bogie_part_address;
    struct LINKED_BOGIE* link;
};

typedef struct LINKED_BOGIE LINKED_BOGIE;


void print_train(LINKED_BOGIE* engine_address);
void add_bogie(LINKED_BOGIE* engine_address);


void add_bogie(LINKED_BOGIE* engine_address)
{
    LINKED_BOGIE* traverse=engine_address;
    LINKED_BOGIE* new_bogie_address=(LINKED_BOGIE*)malloc(sizeof(LINKED_BOGIE));
    new_bogie_ad:dress->bogie_part_address=(BOGIE*) malloc(sizeof(BOGIE));

    printf("Enter bogie name,type,capacity\n");
    scanf("%c%s%d",&(new_bogie_address->bogie_part_address->name),(new_bogie_address->bogie_part_address)->type,&((new_bogie_address->bogie_part_address)->capacity));


    do traverse=traverse->link;
    while(traverse->link!=NULL);

    traverse->link=new_bogie_address;
    new_bogie_address->link=NULL;
    print_train(engine_address);

}



void print_train(LINKED_BOGIE* engine_address)
{

    LINKED_BOGIE* traverse=engine_address;
    int count=0;
    printf("This is the train\n");
    printf("----------------------------------------\n");


    do
    {
        printf("Bogie number:%d\n",count);
        printf("Bogie name:%c\n",traverse->bogie_part_address->name);
        printf("Bogie type:%s\n",traverse->bogie_part_address->type);
        printf("Bogie capacity:%d\n",traverse->bogie_part_address->capacity);
        printf("----------------------------------------\n");
    }
    while(traverse->link!=NULL);

}

int main()
{

    printf("linked bogie size:%lu\n",sizeof(LINKED_BOGIE));
    printf("bogie size:%lu\n",sizeof(BOGIE));

    LINKED_BOGIE* engine_address=(LINKED_BOGIE*)malloc(sizeof(LINKED_BOGIE));
    engine_address->bogie_part_address=(BOGIE*)malloc(sizeof(BOGIE));

    engine_address->bogie_part_address->name='E';
    strcpy(engine_address->bogie_part_address->type,"Engine");
    engine_address->bogie_part_address->capacity=1;
    engine_address->link=NULL;

    //  print_train(engine_address);


    int choice=0;
    do
    {
        printf("Pick what you want to do:\n\
1)View the train\n\
2)Add a bogie\n\
3)Insert a bogie\n\
4)Remove a bogie\n\
5)Sort train\n\
6)Swap bogies\n\
7)Exit\n");

        scanf("%d",&choice);

        switch (choice)
        {
            case 1:print_train(engine_address);break;
            case 2:add_bogie(engine_address);
        }

    }

    while(choice!=7);




return 0;

}

最佳答案

Mike 已经解释过结构体的大小是由填充引起的。在您的系统中,int 使用 4 个字节,并按 4 的倍数地址对齐。

您的 malloc 是正确的,但在稍后删除 boogie 时,您必须始终释放内部和外部结构。

但是您的代码中有一些小错误:

  • scanf("%c%s%d", ...)不会执行您期望的操作:%c 可能会读取上一行的末尾,而不是第一个非空白字符。您应该为此使用 %1s,而不要忘记 null 的位置:

    char name[2];
    ...
    scanf("%1s%19s%d",name,(new_bogie_address->bogie_part_address)->type,
        &((new_bogie_address->bogie_part_address)->capacity));
    new_bogie_address->bogie_part_address->name = name[0];
    
  • do traverse=遍历->链接; while(traverse->link!=NULL); 也不起作用:当火车仅包含一个布吉时,您在测试任何内容之前将 traverse 设置为 null。你应该这样做:

    while(traverse->link!=NULL) {
        traverse = traverse->link;
    }
    
  • 在 `print_traint 中,您忘记移动遍历。应该是:

    while(traverse != NULL)
    {
        ....
        traverse = traverse->link;
        count += 1;
    }
    

记住:

  • %c 很少使用,因为它甚至会读取被其他格式忽略的不可打印字符
  • do {...} while(...); 如果比简单的 while(...) {...} 使用较少,因为它运行它的 body 至少一次。

关于c - C 中的链表、结构的结构、段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40470193/

相关文章:

c - 如果从 WM_CREATE 返回 -1,子窗口是否会自动销毁?

c - 结构中动态分配的指针数组

c - 需要帮助理解功能逻辑

haskell - 为什么我的可变链表比不可变变体慢?

java - 自定义链接列表中的 JTable 数据存在问题

c - 与 pthread_create 不兼容的指针类型 (C)

c - 如何使用C\C++中的while循环(system.ping)来ping渐进式IP

检查文件中的重复单词

c++ - 指向结构 C++ 中的 vector 的指针

algorithm - 计算可能是循环的链表中的节点数