2009-12-21 3 views
0

스택에 요소를 푸시하려고하면 세그먼트 화 오류가 발생하지만 스택의 주소를 열면 ("!!!"로 표시된 경우) 기호로 받아들입니다. 그러나 이번에는 푸시 할 때마다 새로운 주소가 만들어지고 최고 가치가 올라가지 않습니다.c 포인터를 입력으로

typedef struct 
{ 
    struct table **symbols; // array of the stack 
    int top; //index of the top element 
    int size; //maximum size of the stack 
}stack; 

void push(stack *stck,struct table *element) 
{ 
    if(stck->top == stck->size) 
    { 
     printf("stack is full"); 
     return; 
    } 

    stck = malloc(sizeof(stack));           !!! 
    stck->symbols = (struct table **)malloc(50 * sizeof(struct table*)); !!! 

    printf("top : %d\n",stck->top); 
    stck->top = stck->top++; 
    printf("%d"&stck->top); 
    stck->symbols[stck->top] = element; 
    printf("top : %d\n",stck->top); 
} 
+0

모든 논리가 완전히 잘못되었습니다. 캐스팅은 포인터에 대한 포인터를 실제로 포인터의 주소를 가리 키지 않습니다. 루프를 사용하여 수동으로 모두 채우고 '테이블' –

답변

2

스택을 구성하기 전에 스택을 구성해야합니다. 예 : 당신의 스택 메모리를 할당하고 그 구성원을 초기화합니다 기능 stack_new 만들 :

stack * stack_new (size_t size) 
{ 
    stack * stck = malloc(sizeof(stack)); 
    stck->top = -1; 
    stck->size = size 
    stck->symbols = (struct table **)malloc(size * sizeof(struct table*)); 
    return stck; 
} 

을 이제 제대로 위의 함수와 스택을 구축 한 번을, 당신은 기능을 밀어를 전달할 수 있습니다.

+0

당신은 새로운 왕입니다. :) 나는 가치를 되 돌리는 것을 잊는다. – iva123

1

당신은 stck라는 변수에 하나의 스택을 통과,하지만 새로운 구조를 할당하고 같은 포인터에 할당된다. 따라서 전달하는 스택은 수정되지 않습니다. 나는 첫번째 malloc 호출이 필요하다고 생각하지 않는다.

+0

네 개의 행마다 공백을 할당해야합니다. 그러나 세그먼트 제거 오류가 발생하는 경우이를 제거하는 방법을 묻습니다. – iva123

1

push을 호출하기 전에 스택의 공간을 malloc으로 지정하려고합니다.

!!! 줄, 각 푸시 함께 새 메모리를 할당하는 잘못된 것입니다.

!!! 라인을 사용하면 결코 메모리를 할당하지 않을 것입니다.

0

함수 내에서 단일 포인터 스택 * stck과 malloc을 전달하면 함수를 꺼내면 반영되지 않습니다.

또한 왜 푸시 할 때마다 50 개의 포인터에 대해 테이블에 메모리를 할당해야합니까?

아래처럼 수행이 도움이

struct table 
{ 
    //members go here 
}; 

typedef struct 
{ 
    struct table **symbols; 
    int top; 
    int size; 
}stack; 


struct table *get_elem(void) 
{ 
    //logic for getting elements go here 
} 

void stack_push(stack *stck, struct table *element) 
{ 

    if(stck->top==stck->size) 
    { 
    printf("Stack Full\n"); 
    return; 
    } 

    stck->top++; 
    stck->symbols[stck->top] = element; 
    return; 
} 

void stack_func() 
{ 

struct table *elem = NULL; 
stack *stck = (stack *)malloc(sizeof(stack)); 
if(NULL==stck) 
{ 
    return; 
} 

stck->top = -1; 
stck->symbols = (struct table **)malloc(50 * sizeof(struct table *)); 

if(NULL == stck->symbols) 
{ 
    free(stck); 
    return; 
} 

    stck->size = 49; 

    elem = get_elem(); 
    //do check here for correctness of elem returned from get_elem 

    stack_push(stck, elem); 

    return; 
} 

희망을! :)

관련 문제