2017-11-08 1 views
0

나는 포인터와 링크드리스트를 처음 사용합니다. 이 코드는 전체 내용의 일부일뿐입니다. 이 부분을 테스트 및 디버깅을 위해 더 간단하게 만들려고했지만 여전히 알아낼 수 있습니다. 누군가가 주어진 코드를 실행 한 후에 프로세스가 종료되고 있다는 것을 알 수 있습니까?코드가 실행 된 후 프로세스가 종료되는 이유는 무엇입니까? 프로세스가 255를 반환합니다.

add funct works 
added cards 

Process returned 255 (0xFF) execution time : 6.898 s 

왜 반환 255 :

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

#define SPADE "SPADE" 
#define CLUB "CLUB" 
#define DIAMOND "DIAMOND" 
#define HEART "HEART" 

typedef struct Card{ 
    int value; 
    char suit[10]; 
}Card; 

typedef struct BagNode { 
    Card* card; 
    struct BagNode* next; 
}BagNode; 

int main() { 

    BagNode* head = NULL; 
    BagNode* tail = NULL; 

    const char* suit = SPADE; 
    int value = 6; 


    if(tail == NULL) 
    { 
     printf("add funct works\n"); 
     BagNode* newNode = (BagNode*)malloc(sizeof(BagNode)); // allocate space 
     newNode->card->value = value;         // assign value 
     strcpy(newNode->card->suit, suit);      // assign value 
     head = newNode; 
     tail = newNode; 
     printf("added cards\n"); 
    } 
    else{ 
     BagNode* newNode = (BagNode*)malloc(sizeof(BagNode)); // allocate space 
     newNode->card->value = value;         // assign value 
     strcpy(newNode->card->suit, suit);      // assign suit 
     tail->next = newNode; 
     tail = newNode; 
    } 
} 

이 출력이 보이는 무엇인가?

어떤 방향으로 큰 감사하겠습니다!

** 참고 : 나는 C에 쓰고 있어요

+1

파일의 마지막'}'바로 앞에'return 0; '을 넣으십시오. –

답변

1

포인터가 당신을 겁나게하고 있습니다 :) 당신이 초기화하지 않은 포인터에 액세스하고 있기 때문에 귀하의 프로그램이 충돌하기 때문에 그것이 가리 키도록되어있는 객체가 존재하지 않습니다.

포인터는 객체에 대한 참조 일뿐입니다. 귀하의 경우 먼저 카드가 Card 객체에 대한 포인터임을 알려줍니다.

typedef struct BagNode { 
    Card* card; 
    struct BagNode* next; 
}BagNode; 

그러나 아직 우리에게 실제 카드 객체의 위치를 ​​말했다

Card mycard; 
newNode->card=&mycard;//pointer equals to address of mycard 

또는 짧은에

newNode->card=(Card*)malloc(sizeof(Card));// works because now there is an actual memory location pointed at. 

같은 뭔가, 포인터가 가리키는되지 않은 기억 존재하지 않는 카드 !!! 가장 쉬운 해결책은 카드가 실제 개체가 아니라 포인터가되도록하여 구조체의 정의를 변경

newNode->card->value 

입니다

이 존재하지 않는 카드에 액세스하려고하는 순간, 프로그램이 충돌하는

typedef struct BagNode { 
    Card card;//actual object not the pointer to an object 
    struct BagNode* next; 
}BagNode; 

는이

newNode->card.value 

처럼 사용하거나, 다른 사람은 INI 수 있습니다 카드 객체를 사용하기 전에 카드 객체의 주소로 카드 포인터를 표시하십시오.

1

내 생각 엔 당신이

newNode->card->value 

카드를 수행 할 때하는 것은 너무 값이 무엇을하는 널 포인터의 멤버를 할당, 널 포인터이다 귀하의 프로그램이 충돌을 일으키고 있습니다

+0

값은 초기화되지 않았습니다. –

+0

좋아요, 그래서 카드를 추가해야합니다 = & BagNode? 어디에서 추가 할 수 있습니까? – blazek

+0

아니요, malloc 카드가 있어야합니다 – adrotter

0

일부 잘못된 주소를 가리키는 초기화되지 않은 포인터 때문에 메모리 "카드"를 할당해야하므로 OS에서 세그먼트 오류가 발생합니다.

so for this add this line : 
       newNode->card=malloc(sizeof(Card)); 
    before this line 
       newNode->card->value = value; 

및 main() 함수가 성공적으로 완료 한 후, 그것 때문에 실패의는 255에 불과하다 2 바이트에 1을 반환 즉 1을 반환 귀하의 경우 내 지식으로 0 또는 1을 반환

.

관련 문제