【发布时间】:2017-01-19 10:42:16
【问题描述】:
试图实现一个简单的通用堆栈我经历了一堆堆栈溢出和分段错误我写了这个:
#include <stdlib.h>
#include <stdio.h>
#define nullptr (void *)0
struct S {
void *content;
struct S *next;
};
typedef struct S Stack;
Stack *createStack() {
Stack *tmp = (Stack *) malloc(sizeof(Stack));
tmp->content = nullptr;
tmp->next = nullptr;
return tmp;
}
Stack *pushStack(Stack *ptr, void *content) {
Stack *newStr = createStack();
newStr->content = content;
newStr->next = ptr;
ptr = newStr;
return (ptr);
}
Stack *popStack(Stack *ptr, void *value) {
Stack *toDelete = ptr;
value = ptr->content;
ptr = ptr->next;
free(toDelete);
return (ptr);
}
Stack *stackHandle = nullptr;
void printStack(Stack *ptr) {
int *element;
int i;
for(i=0; i <= 20; i++) {
ptr = popStack(ptr, element);
printf("%d ", *element);
}
printf("\n");
}
int main() {
stackHandle = createStack();
int i;
for(i=0; i <= 21; i++) {
stackHandle = pushStack(stackHandle, &i);
}
printStack(stackHandle);
}
一切正常,但无法从 void 指针恢复我的 int ......
分析其他实现我仍然不明白为什么我的不工作。
在这里,我期待看到21 i 次,但我却得到了
0 8240 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056 842539056
对于每个大于 20 的 i 值,如果 i 低于 20,则为漂亮的分段错误
【问题讨论】:
-
不要定义自己的空指针符号,使用标准的
NULL。虽然您的宏对于NULL来说是最常见的,但它不是可移植的,而且您的代码的读者也不会期望看到它。不要重新定义已经存在的东西。 -
至于你的问题,你堆栈中的所有节点都会有它的数据指针指向同一个变量。如果您在调试器中单步执行代码,应该会非常明显。
-
另外,如果代码被移植,
nullptr会与 C++ 发生冲突。 -
您必须分配空间以将
int存储在content中。并且还存储存储数据的大小。 -
您还需要搜索并阅读有关在 c 中通过引用模拟调用。因为现在你的
popStack函数并没有按照你的想法做。当您在printStack函数中取消引用element时,这将导致 未定义的行为。
标签: c stack void-pointers