(C编程)链表上总线错误

ctzwtxfj  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(150)

我正在学习使用linkedlist,我觉得我已经理解了这个概念,但是当编码的时候为什么我总是得到一个错误(总线错误)...这个代码可以运行,但是只有在“SCANF the NAME”之后出现错误。

typedef struct Student{
    char name[20];
    char idNum[10];
    int  saving;

    struct Student *next;
}Student;

Student *head = NULL;

void insert_student(){
    char *name,*idNum;
    int saving;

    Student *current;
    Student *new_student;
    new_student = (Student*)malloc(sizeof(Student));

    // apakah ada memoory kosong?
    if(new_student==NULL){
        printf("==== YOUR MEMMORY IS FULL! ====\n");
        exit(0);
    }

    printf("Enter your name     : ");scanf("%[^\n]s",name);
    printf("Enter your Id       : ");scanf("%[^\n]s",idNum);
    printf("How many your money : Rp");scanf("%d",&saving);

    strcpy(new_student->name,name);
    strcpy(new_student->idNum,idNum);
    new_student->saving = saving;

    new_student->next = NULL;

    if(head==NULL){
        head = new_student;
    }
    else{
        current = head;
        while (current->next != NULL)
        {
            current = current->next;
        }
        current->next = new_student;
    }
}
void print_students(){
    Student *current;

    if(head==NULL){
        printf("==== THERE IS NO STUDENT YET!\n");
        exit(0);
    }
    current = head;
    while (current!= NULL)
    {
        printf("Name   : %s",current->name);
        printf("id     : %s",current->idNum);
        printf("Saving : Rp%d",current->saving);

        current = current->next;
    }
    
}

int main(){
    insert_student();
    print_students();
return 0;
}

我希望为动态链接列表Student创建节点,然后显示它们

z9zf31ra

z9zf31ra1#

printf("Enter your name     : ");scanf("%[^\n]s",name);
  printf("Enter your Id       : ");scanf("%[^\n]s",idNum);

在给予namedidNum的值传递给scanf之前,你必须给它们赋予有意义的值。相反,你只是将未初始化的垃圾值传递给scanf,这是行不通的。你必须将指针传递给scanf,指针指向你要阅读的字符串的位置。

dgsult0t

dgsult0t2#

对于初学者来说,让函数依赖于全局变量head是一个坏主意。在这种情况下,你将无法在程序中使用多个列表。
在函数insert_student中,您声明了未初始化的指针nameidNum

char *name,*idNum;

所以在scanf的调用中使用它们

printf("Enter your name     : ");scanf("%[^\n]s",name);
printf("Enter your Id       : ");scanf("%[^\n]s",idNum);

调用未定义的行为。
需要声明字符数组而不是指针

char name[20], idNum[10];

格式规格也不正确。
你应该写

printf("Enter your name     : "); scanf( " %19[^\n]", name );
printf("Enter your Id       : "); scanf( " %9[^\n]", idNum );

注意格式字符串中的前导空格它允许跳过白色字符。
否则,在调用scanf之后

printf("How many your money : Rp");scanf("%d",&saving);

输入缓冲区将包含换行符'\n'。因此,当您第二次调用函数insert_student时,第一次调用scanf(如果格式规范不包含前导空格)

printf("Enter your name     : "); scanf( "%19[^\n]", name );

将读取空字符串。
此外,如果没有分配新节点,则整个程序退出,这也不是一种灵活的方法。

if(new_student==NULL){
    printf("==== YOUR MEMMORY IS FULL! ====\n");
    exit(0);
}

最好向调用者返回一个整数,以报告函数是否成功执行。

int insert_student( void )
{
    //...
    Student *new_student;
    new_student = (Student*)malloc(sizeof(Student));
   
    int success = new_student != NULL;

    if ( success )
    { 
        printf("Enter your name     : ");scanf("%[^\n]s",name);
        printf("Enter your Id       : ");scanf("%[^\n]s",idNum);
        printf("How many your money : Rp");scanf("%d",&saving);
        //...
    }

    return success;
}

相关问题