2017-03-31 8 views
0

C에서 연결된 목록을 사용하여 스택을 구현하려고하지만 새 값을 입력 한 후에 값을 호출하려고 할 때마다 segfaults가 발생합니다. 스택에. 나는 프로그램이 여전히 스택이 null이라고 덧붙여서 이것이 일어나고 있음을 알고있다. 어떤 이유에서 나는 푸시에서 변경 한 사항이 함수가 종료 될 때 머물러 있지 않고 이유를 파악할 수 없습니다. 그것의 일부, 도움을 주셔서 감사합니다하지만 난 푸시 정확히 이러한 매개 변수와 함께 수행되어야한다는 얘기를 깜빡 했네요 :초기화 된 스택에 데이터를 푸시 할 때 C 연결 목록이 변경되지 않음

typedef struct stack 
{ 
    int value; 
    struct stack * next; 
} * stack_T; 

stack_T 
new_stack() 
{ 
    return NULL; 
} 

int 
push_stack(stack_T s, int data) 
{ 
    stack_T new = malloc(sizeof(stack_T)); 
    new = s; 
    if (s == NULL) 
    { 
     s = malloc(sizeof(stack_T)); 
     if (s == NULL) 
      return 1; 
    } 
    s->value = data; 
    s->next = new; 
    return 0; 
} 

편집 :

여기 내 스택 구조체 초기화 코드 및 푸시입니다 과제. 나는 그것을하는 방법을 찾고있는 것이 아니라 내가 잘못하고있는 것을 찾고 있습니다. 내가 참조로 패스를 에뮬레이션 할 수 있다는 것을 알고 있지만, 내가 말했듯이 있어야한다 :이 스타일 이전

int push_stack(stack_T s, int data) 

내가 만든 한 구조체 단지 매개 변수로 데리고 기능을 가지고 및 변경은 유지하지만 원 이 경우에 나는 왜 그런지 전혀 모른다.

+2

을 발생하는되는 행을 결정하기 위해 valgrind를 사용할 수 있다는 것입니다. 왜냐하면'malloc (sizeof (stack_T))'는 구조체가 아닌 포인터 ***에 충분한 공간을 할당하기 때문입니다. –

+0

c *에서 참조로 에뮬레이션 호출을 검색하고 읽으려면 시간이 좀 걸릴 것입니다. –

+1

또한 스택을 malloc했지만 다음 라인의 유일한 참조를 덮어 씁니다 .... 무엇을 가리키는 지 그림을 그려야하고 코드를 따라 가야합니다. 많은 실수가 있습니다 ... – blackghost

답변

0

s을 이중 포인터로 표시하지 않은 것 같습니다. 연결된 목록의 맨 앞으로 밀어 넣으려고하는 것 같습니다. 필요한 것은 메모리에 저장된 주소 값을 변경하기 위해 스택 헤드에 대한 참조의 이중 포인터를 전달하는 것입니다. 이 방법을 사용하면 항상 스택의 맨 위를 참조하게됩니다.

int 
push_stack(stack_T **s, int data) 
{ 
    stack_T *new = malloc(sizeof(stack_T)); 
    if (new == NULL) 
     return (1); 
    if (s == NULL) 
    { 
     free(new); 
     return (1); 
    } 
    new->value = data; 
    new->next = *s; 
    *s = new; 
    return 0; 
} 

세그 폴트가 발생하는 주요 기능이 어떻게 호출되는지 확인해야합니다. 그러나 스택 맨 위에 적절한 참조가없는 것 같습니다. 또한, 왜 두 노드에 대한 공간을 malloc했는지 이해가되지 않습니다. Malloc은 사용자가 지정한 크기만큼의 포인터를 리턴합니다. 여기에 쓴

:

stack_T new = malloc(sizeof(stack_T)); 
new = s; 
if (s == NULL) 
    { 
     s = malloc(sizeof(stack_T)); 
     if (s == NULL) 
      return 1; 
    } 

당신의 변수를 저장하려고, 그래서 당신이 그것을 할당으로 무효 포인터와 S의 AA 타입이 아닌 포인터 타입이다 NULL을 만나되지 않습니다 malloc이 8 바이트의 포인터를 반환 할 때 12 바이트.

또한 팁은 gcc -g 컴파일 및 stack_T``처럼 세그먼트 폴트 당신은 일반적으로 포인터의 타입 별칭을 작성해서는 안

+0

아니,'stack_T'은 이미 포인터 타입이므로,'stack_T *'는 사실 이중 포인터입니다. OP의 무례한 행동으로 typedef 뒤에 숨어 있습니다. –

+0

S는 NULL로 초기화되므로 첫 번째 검사에서 NULL이 될 수 있고 두 번째 검사의 이유는 malloc이 어떤 이유로 든 NULL을 반환하는 메모리를 찾을 수없는 드문 경우입니다. 또한 John이 말한 것처럼 stack_T는 이미 포인터입니다. 그래도 도움을 주셔서 감사합니다. – forev3r