【发布时间】:2014-10-02 21:37:42
【问题描述】:
我正在尝试在 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;
}
问题是我运行程序时什么都没有,只需按回车键关闭窗口。我正在使用 GCC 工具包在 Linux 上编程。
【问题讨论】:
-
我仍在扫描您的程序,但我的第一个想法是您没有在
allocate_stack()函数中检查空s。 -
我不需要,s在stack中声明,只有elems在heap中。
-
我的意思是你在
main()中声明stack *s = NULL;(换句话说,s是一个空指针),然后你将该空指针传递给allocate_stack(),它会立即尝试取消引用该指针。按原样运行您的代码(尽管我同意我使用 Visual Studio 在 W7 上)导致在第一次取消引用发生时,s->sizeOfElems = sizeOfElements;行上几乎立即发生程序崩溃。不过,我完全有可能在这里误解了一些东西,所以也许你可以让我直截了当。 -
另一条评论:我猜你是最近才开始接触 C 语言的,可能来自 Python 世界,因为你在
push_elem()中的if语句可能不会做你想做的事去做。您可能应该将if语句的整个主体括在{...}花括号中。 -
我的编程背景涉及 Python,但这不是我的第一语言,if 语句是错字。这只是一个测试,我的意思是我尝试了 stack *s = NULL,因为仅声明 stack s 不起作用。