c - 这个堆栈实现的问题

标签 c stack c-strings

错在哪里?

我的代码在这里:

 typedef struct _box
    {
        char *dados;
        struct _box * proximo;
    } Box;

    typedef struct _pilha
    {
        Box * topo;
    }Stack;

void Push(Stack *p, char * algo)
{
    Box *caixa;
    if (!p)
    {
        exit(1);
    }

    caixa = (Box *) calloc(1, sizeof(Box));
    caixa->dados = algo;
    caixa->proximo = p->topo;
    p->topo = caixa;
}


char * Pop(Stack *p)
{
    Box *novo_topo;
    char * dados;
    if (!p)
    {
        exit(1);
    }

    if (p->topo==NULL)
        return NULL;

    novo_topo = p->topo->proximo;

    dados = p->topo->dados;

    free(p->topo);
    p->topo = novo_topo;

    return dados;
}


void StackDestroy(Stack *p)
{
    char * c;
    if (!p)
    {
        exit(1);
    }
    c = NULL;
    while ((c = Pop(p)) != NULL)
    {
        free(c);
    }
    free(p);
}

int main()
{
int conjunto = 1;
char p[30], * v;
int flag = 0;

Stack *pilha = (Stack *) calloc(1, sizeof(Stack));

FILE* arquivoIN = fopen("L1Q3.in","r");
FILE* arquivoOUT = fopen("L1Q3.out","w");

if (arquivoIN == NULL)
{
    printf("Erro na leitura do arquivo!\n\n");
    exit(1);
}

fprintf(arquivoOUT,"Conjunto #%d\n",conjunto);

while (fscanf(arquivoIN,"%s", p) != EOF )
{
    if (pilha->topo == NULL && flag != 0)
    {
        conjunto++;
        fprintf(arquivoOUT,"\nConjunto #%d\n",conjunto);
    }

    if(strcmp(p, "return") != 0)
    {
        Push(pilha, p);
    }

    else
    {
        v = Pop(pilha);

        if(v != NULL)
        {
            fprintf(arquivoOUT, "%s\n", v);
        }
    }
    flag = 1;
}

StackDestroy(pilha);

return 0;

Pop 函数返回从文件中读取的字符串值。 但这是不正确的,我不知道为什么。

最佳答案

您没有为 dados 指向的字符串分配任何存储空间 - 您只是重新使用一个字符串缓冲区 (p) 并传递它,所以你所有的堆栈元素都指向这个字符串。

关于c - 这个堆栈实现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2612506/

相关文章:

c - 使用gpsd/libgps C获得gps时间

c - 为什么这个使用链表堆叠的程序不起作用?

c - 如何创建中断堆栈?

c - 想知道此声明与代码中的注释相比有什么问题吗? - 初学者在这里

c - C 中带有 break 或 continue 语句的 foreach 宏

c - 如何覆盖C中的文件?

c - 是否可以同时执行 if 和 else 部分的 if --- else 控制语句?

c++ - 如果我将分配在堆栈上的元素的指针插入 std::vector ,则其成员的值将被更改

c - 文件到字符串数组(逐行)

c - String #define 返回一个随机整数