2013-10-13 47 views
0

试图找出为什么这段代码返回一个分段错误。 Gdb说这条线给我的错误strcpy(newNode -> data -> ticket_name, name);它说在函数strcat()。有任何想法吗?我还想指出的是,我很新的C.当我尝试将新节点添加到链接列表时,为什么会出现分段错误?

void add_ticket(tm_type * tm) 
{ 
    char name[TICKET_NAME_LEN+1], type, zone[TICKET_ZONE_LEN], buffer[5], *ptr, *pos; 
    int price; 
    BOOLEAN check = TRUE; 
    printf("Add Ticket\n"); 
    printf("----------\n"); 
    printf("\n"); 
    printf("Ticket name (1-40 characters): "); 
    if(fgets(name, sizeof(name), stdin) != NULL){ 
     if(name[0] != '\n'){ 
      if((pos=strchr(name, '\n')) != NULL){ 
       *pos = '\0'; 
      } 

      printf("\nTicket type (1 character): "); 
      type = fgetc(stdin); 
      if(type != '\n'){ 

       read_rest_of_line(); 
       printf("\nTicket zone (1-3 characters): "); 
       if(fgets(zone, sizeof(zone), stdin) != NULL){ 
        if(zone[0] != '\n'){ 
         if((pos=strchr(zone, '\n')) != NULL){ 
          *pos = '\0'; 
         } 

         printf("\n\n"); 
         printf("Price (in cents): "); 
         if(fgets(buffer, sizeof(buffer), stdin) != NULL){ 
          price = strtol(buffer, &ptr, 10); 
          if(buffer[0] != '\n'){ 

           //create new node 
           stock_node *newNode = (stock_node*)malloc(sizeof(stock_node)); 

           if(newNode == NULL){ 
            fprintf(stderr, "Unable to allocate memory for new ticket.\n"); 
            exit(EXIT_FAILURE); 
           } 

           strcpy(newNode -> data -> ticket_name, name); 
           newNode -> data -> ticket_type = type; 
           strcpy(newNode -> data -> ticket_zone, zone); 
           newNode -> data -> ticket_price = price; 
           newNode -> data -> stock_level = DEFAULT_STOCK_LEVEL; 
           newNode -> next_node = NULL; 

           //check for first insertion 
           if(tm -> stock -> head_stock -> next_node == NULL){ 
            tm -> stock -> head_stock -> next_node = newNode; 
            printf("First ticket added.\n"); 
           } 

           else{ 
            //else loop through the list and find the last 
            //node, insert next to it 
            stock_node *stream = tm -> stock -> head_stock; 
            while(check == TRUE){ 

             if(stream -> next_node == NULL){ 
              stream -> next_node = newNode; 
              printf("Ticket added.\n"); 
              check = FALSE; 
             } 
             stream = stream -> next_node; 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+1

添加的声明'stock_node' –

+1

你有没有的malloc的'newNode->数据 - > ticket_name'会员? – Leonardo

+0

原因#不知道为什么您不将列表管理代码与UI交互进行整合。代码变成意大利面。如果数据阅读器和列表插入是独立的功能,这个问题将会相当容易被发现。 **学会调试**。在调试环境下运行此操作将完全保证立即对出现故障的所有可能性*做出响应。 – WhozCraig

回答

1

你为newNode分配的空间,但你从来没有任何形式的初始化。因为这个newNode -> data包含垃圾,所以当你用第二个箭头解引用它时,你会得到一个seg错误。我的C生锈,但我相信你想

// create new node 
stock_node *newNode = (stock_node*)malloc(sizeof(stock_node)); 

newNode -> data = (data_struct*)malloc(sizeof(data_struct)); 

... 
+0

谢谢你。 'newNode - > data = malloc(sizeof(struct stock_data));'完美运行。 – An0nx

相关问题