C 通用堆栈don';t推送或弹出值

C 通用堆栈don';t推送或弹出值,c,generics,C,Generics,我试图在C中实现泛型堆栈,但无法打印我推送的值。这是密码 #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <memory.h> typedef struct{ void *elems; int sizeOfElems; int allocated; int lenght; }stack; void allocate_stack

我试图在C中实现泛型堆栈,但无法打印我推送的值。这是密码

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <memory.h>

typedef struct{
    void *elems;
    int sizeOfElems;
    int allocated;
    int lenght;
}stack;

void allocate_stack(stack *s, int sizeOfElements){
    assert(sizeOfElements > 0);
    s->sizeOfElems = sizeOfElements;
    s->allocated = 2;
    s->lenght = 2;
    s->elems = malloc(sizeOfElements * s->allocated);
}

void deallocate_stack(stack *s){
    free(s->elems);
}

void push_elem(stack *s, void *elem){
    s->lenght += 1;
    if(s->allocated == s->lenght){
        realloc(s, s->lenght * s->sizeOfElems);
        s->lenght *= 2;
    }
     void *target = (char *)s->elems + s->lenght * s->sizeOfElems;
     memcpy(target, elem, s->sizeOfElems);
}
void pop_elem(stack *s, void *elemAddr){
    void *source = (char *)s->elems + (s->lenght-1) * s->sizeOfElems;
    memcpy(elemAddr, source, s->sizeOfElems);
    s->lenght -=1;
}
int main(){
    stack s;
    allocate_stack(&s, 1);
    char a = 'a';
    push_elem(&s, &a);
    char *elem = NULL;
    pop_elem(&s, elem);
    printf("%s", elem);
    deallocate_stack(&s);
    return 0;
}
#包括
#包括
#包括
#包括
类型定义结构{
无效*元素;
国际规模基金会;
分配的整数;
内部长度;
}堆叠;
void allocate_堆栈(堆栈*s,int-sizeOfElements){
断言(sizeOfElements>0);
s->sizeOfElems=sizeOfElements;
s->分配=2;
s->lenght=2;
s->elems=malloc(sizeOfElements*s->已分配);
}
无效释放\u堆栈(堆栈*s){
免费(s->elems);
}
无效推送元素(堆栈*s,无效*elem){
s->长度+=1;
如果(s->已分配==s->长度){
realloc(s,s->lenght*s->sizeOfElems);
s->长度*=2;
}
void*target=(char*)s->elems+s->lenght*s->sizeOfElems;
memcpy(目标、元素、s->sizeOfElems);
}
void pop_elem(堆栈*s,void*elemAddr){
void*source=(char*)s->elems+(s->lenght-1)*s->sizeOfElems;
memcpy(elemAddr,source,s->sizeOfElems);
s->长度-=1;
}
int main(){
堆栈s;
分配\u堆栈(&s,1);
字符a='a';
推送元件(s&a);
char*elem=NULL;
流行元素(&s,元素);
printf(“%s”,elem);
解除分配\u堆栈(&s);
返回0;
}

问题是,当我运行程序时,没有得到任何信息,只需按return键关闭窗口。我正在使用GCC工具包在Linux上编程

缺少堆栈结构的分配。执行
allocate\u stack
操作时,必须调用allocate来创建堆栈对象,然后才能将对象分配给它。例如,您传入的s为null,您开始尝试为它的各个字段赋值。这是未定义的行为,可能是程序无法运行的原因

尝试更改allocate_stack函数的签名以返回堆栈指针,然后第一步应该是
malloc(sizeof struct stack)
。您应该返回从和处的malloc获取的指针,并将其分配给s

编辑:除非您希望堆栈位于堆栈上,在这种情况下,将其作为普通变量进行分配

在推送元素中:

    s->lenght += 1;
    if(s->allocated == s->lenght){
        realloc(s, s->lenght * s->sizeOfElems);
        s->lenght *= 2;
    }
如果空间用完,您似乎正在尝试重新分配空间,但分配的默认值2将保持不变,您可能应该执行以下操作:

    if (s->allocated < s->lenght) {
        realloc(s->elems, ....)
        //Increase both allocated and length to represent the current state of the stack
    }
if(s->assignedlength){
realloc(s->elems,…)
//增加allocated和length以表示堆栈的当前状态
}
请注意,在realloc()调用中,您传递的是堆栈中的s,这不会满足您的要求: 根据你的结构,你应该通过 s->elems


另外,在调用pop_elem之前,您将为elem分配NULL。在你的pop_元素中,这是你试图做memcpy()的地方。为此,您必须分配内存:

我仍在扫描您的程序,但我的第一个想法是您没有在
allocate_stack()
函数中检查null
s
。我不需要,s在堆栈中声明,只有元素在堆中。我要说的是,您正在声明
stack*s=nullmain()
中的code>(换句话说,
s
是一个空指针),然后将该空指针传递给
allocate\u stack()
,它会立即尝试取消引用该指针。按原样运行代码(尽管我被授权使用VisualStudio在W7上)会导致行
s->sizeOfElems=sizeOfElements上的程序几乎立即崩溃,就在第一次取消引用时。不过,我完全有可能在这里误解了什么,所以也许你可以澄清一下。另一条评论:我猜你最近才来到C,可能来自Python世界,因为你在
push_elem()
中的
if
语句可能不符合你的要求。您可能应该将
if
语句的整个主体括在
{…}
大括号中。我的编程背景涉及Python,但这不是我的第一语言,if语句是打字错误。这只是一个测试,我的意思是我尝试了stack*s=NULL,因为只声明stack s不起作用。我的想法是在堆栈中分配堆栈,而不是在堆中,只有元素(结构的一部分)要在堆中分配。但是我在main func中更改了堆栈的声明,并在堆中分配了,得到了相同的结果。要做到这一点,你就必须做堆栈;而不是堆栈*s;看看这个问题发生了什么,说它不起作用对任何人都没有帮助。社区不是来为您编写代码的,至少给出一条错误消息。我没有收到任何错误消息,我只收到xterm的“按…返回”,我的调试器坏了(不知道为什么)。我使用QT creator作为IDE,使用gcc工具包,我在debain wheezy x86上运行。尝试用新代码更新原始问题