2013-10-13 4 views
0

이 코드가 세분화 오류를 반환하는 이유를 파악하려고합니다. Gdb는 내게 오류 strcpy(newNode -> data -> ticket_name, name);을주는 줄을 말합니다. 기능은 strcat()입니다. 어떤 아이디어? 나는 또한 C.링크 된 목록에 새 노드를 추가하려고하면 분할 오류가 발생하는 이유는 무엇입니까?

당신은 newNode을위한 공간을 할당
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

이의 선언을 추가 할 생각' –

+1

는 회원 ticket_name'은'newNode-> 데이터 -> 당신의 malloc나요 stock_node'? – Leonardo

+0

이유 # 목록 관리 코드를 UI 상호 작용과 통합하지 않는 이유가 없습니다. 코드가 스파게티가됩니다. 이 문제는 데이터 판독기와 목록 삽입이 별개의 기능이라면 상당히 쉽게 발견 될 수 있습니다. ** ** 디버그 방법을 배웁니다. 디버깅 환경에서이 작업을 실행하면 오류가 발생한 정확한 위치 *에 대한 즉각적인 대응이 보장됩니다. – WhozCraig

답변

1

매우 새로 온 것을 지적하고 싶습니다,하지만 당신은 초기화의 어떤 종류를 결코하지 않았다. 이 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