簡體   English   中英

c中的鏈表,結構體的結構,分段錯誤

[英]Linked lists in c, struct of struct, segmentation fault

我正在嘗試在c中實現火車結構。 我有一個稱為轉向架的結構,另一個稱為鏈接轉向架。 我在如何在代碼中引用這些結構的所有組件時遇到問題。 我的主要問題是:

-輸入轉向架類型時出現段故障

-轉向架的尺寸為何為28? (char(1)+ array(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的地址倍數對齊。

您的mallocs是正確的,但是在以后刪除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=traverse->link; 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(...) {...}因為它至少運行一次它的主體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM