2012-03-02 3 views
1

Я пытаюсь реализовать структуру стека в C, для хранения массивов char.Реализация стопки «строк» ​​в C

У меня есть следующий код:

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'). И когда я хочу выложить стек, всплывающее значение пуст. Не пустой, но пустая строка или что-то еще?

Я понятия не имею, что я делаю неправильно, но, кажется, что-то случилось, очевидно.

Сэого

+1

Вы не показываете, где вы вызываете этот код, но я предполагаю, что у вас есть «имя» в статическом буфере или что-то еще? Если вы хотите, чтобы фактические строки вошли в стек, вам нужно выделить память для каждого, прежде чем вы ее разместите. Кроме того, вы можете сделать '* ((loods-> data) + loods-> size ++) = strdup (name)'. Вам просто нужно освободить их по отдельности позже. –

ответ

2

В функции push, если вы передаете символ char *, он будет переадресовывать указатель на то, где символ char, а когда вы выполняете p ++, он будет передаваться с символа *, который вы передали.

изменение Try толчок определение:

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 = operator (это то, что вы можете использовать чаще всего). Уравнение указателя всегда находится там, где проблема лежит. – ziq

+0

Да, я изменил функцию free(). Но отлично, спасибо! – saltandpepper

1

Я перелистал код и, кажется, будет хорошо, я думаю, что проблема в клиенте.

Ваши единственные указатели магазина в стеке, вы, вероятно, нажимаете тот же указатель на стек, но переписываете строку, на которую указывает.

Обратите внимание, что если вы действительно хотите хранить указатели, ваш третий malloc тратит впустую пространство, а также создает утечку памяти.

+0

Там также будет memleak, потому что второй 'malloc' также не освобожден. – netcoder

+0

Так что я должен освободить mallocs, как отредактировал в своем оригинальном посте? – saltandpepper

+0

'i

Смежные вопросы