2012-03-02 2 views
1

char 배열을 저장하기 위해 C로 스택 구조를 구현하려고합니다.C에서 "strings"스택 구현

typedef struct { 
    size_t size; 
    char **data; 
} loods1; 

loods1 *init(void) { 
    loods1 *loods = malloc(sizeof(loods1)); 
    loods->data = malloc(sizeof(char *) * STACK_MAX); 
    for (int i = 0; i < STACK_MAX; i++) { 
    *(loods->data + i) = malloc(LABEL_LENGTH_MAX * sizeof(char)); 
    } 
    loods->size = 0; 
    if (loods == NULL) { 
    perror("malloc failed\n"); 
    return NULL; 
    } 
    return loods; 
} 

int empty(loods1 *loods) { 
    return (loods->size == 0); 
} 
void push(loods1 *loods, char *name) { 
    if (loods->size == STACK_MAX) { 
    perror("Stack is full\n"); 
    exit(0); 
    } 
    else { 
    *((loods->data) + loods->size++) = name; 
    } 
} 
char *pop(loods1 *loods) { 
    if (loods->size == 0) { 
    printf("size == 0\n"); 
    return NULL; 
    } 
    else { 
    printf("%s \n", *(loods->data + 1)); 
    return *(loods->data + (--loods->size)); 
    } 
} 
int delete(loods1 *loods) { 
    for (int i = 0; i < STACK_MAX; i++) { 
    free(*(loods->data + i)); 
    } 
    free(loods->data); 
    free(loods); 
} 

2 문제가 있습니다 :

나는 다음과 같은 코드가 첫째를, 내가 스택에 새로운 요소를 추가 할 때마다, 그것은 경우 '3'과 '11'(기존의 모든 요소를 ​​덮어 '15', 15 ','15 ','15 '와 같은 새 스택이 추가됩니다. 그리고 스택을 pop하고 싶을 때, pop 된 값은 비어 있습니다. null도 아니고 빈 문자열 또는 무엇인가?

내가 뭘 잘못하고 있는지 잘 모르겠지만 분명히 어딘가에 실수가있는 것 같습니다.

새미

+1

당신은이 코드를 어디에서 호출하는지 표시하지 않지만 내 생각에 정적 버퍼 또는 다른 이름에'name'이 있습니까? 실제 문자열을 스택에 저장하려면 각 문자열을 배치하기 전에 각 문자열을 할당해야합니다. 또는'* ((loods-> data) + loods-> size ++) = strdup (name)'을 할 수 있습니다. 나중에 개별적으로 해제하면됩니다. –

답변

2

push 함수에서 char *를 전달하면 포인터가 char * 인 곳으로 전환되고 p ++를 수행하면 전달 된 char *에서 이동합니다. 당신은뿐만 아니라 당신의 호출 프로그램에 다른 변경해야 할 수 있습니다 여기에서

void push(loods1 *loods, const char *name) { 
    if (loods->size == STACK_MAX) { 
    perror("Stack is full\n"); 
    exit(0); 
    } 
    else { 
    strcpy((loods->data)[loods->size++], name); 
    } 
} 

:에

보십시오 변화 푸시 정의.

또한 무료로 제공 할 때 할당 된 메모리를 모두 비우지는 않습니다.

+0

당신은 완전히 옳습니다. 이제 작동합니다. 좋아, 고마워! 또 다른 질문 : 할당 된 모든 메모리를 어떻게 해제해야합니까? – saltandpepper

+1

또한 C에서 use = 연산자를 사용할 때 매우주의해야합니다 (가장 자주 사용할 수 있습니다). 포인터 방정식은 항상 문제가있는 곳입니다. – ziq

+0

예, free() 함수를 변경했습니다. 하지만 고마워! – saltandpepper

1

나는 코드를 가볍게 그것을 확인하기 위해, 나는 문제가 클라이언트에서 생각하는 것 같다.

스택에 유일한 상점 포인터가 있습니다. 스택에 동일한 포인터를 밀고 있지만 포인터가 가리키는 문자열을 다시 쓸 것입니다.

포인터를 저장하고 싶다면 3 번째 malloc이 공간을 낭비하고 메모리 누수가 발생합니다.

+0

두 번째'malloc '도 해제되지 않았기 때문에 memleak도 있습니다. – netcoder

+0

원본 게시물을 편집 할 때 mallocs를 해제해야합니까? – saltandpepper

+0

'i