Noo*_*der 0 c stack pointers void-pointers data-structures
我很难完全理解和学习指针、强制转换和所有这些的行为。
我有以下结构,它基本上是一个stack data structure
:
struct stack
{
void **items;
size_t top;
size_t max_size;
};
Run Code Online (Sandbox Code Playgroud)
我希望能够返回top element
,所以这是我的Peek
功能:
void *Peek(const stack_ty *stack)
{
return(stack->items[stack->top]);
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试打印main.c
:
stack_ty *new_stack = CreateStack(5);
Push(new_stack, (void *)1);
Push(new_stack, (void *)2);
Push(new_stack, (void *)3);
printf("The top element is %d\n", *(int *)Peek(new_stack));
Run Code Online (Sandbox Code Playgroud)
Segmentation fault (core dumped)
它进入Peek
函数后我得到了一个权利。
我猜这与*(int *)
我对 的返回值所做的转换有关Peek()
,但我想不出任何其他方式来print()
或显示void *
.传递的任何值。我的意思是,我必须将它投射到int *
或char *
或其他什么,对吗?
我在这里做错了什么?我很高兴听到有关如何更好地理解整件事pointers
的任何提示。我的意思是,我认为我很擅长它,但我想我错了。
说实话,一开始我以为我需要投1,2 and 3
给(void *)&1
,(void *)&2
,(void *)&3
,因为我觉得我不能不去就这样,我想,如果我想投一个int
到void *
我已经给它address
的int
.
但是编译器对我尖叫,所以我把它改成了 Push(new_stack, (void *)3);
由于您在推动时将an 转换int
为 a void *
,因此您需要int
在偷看时将其转换回 an ,而不是int *
。您不是在堆栈中存储指向整数的指针,而是将整数本身视为指针。
printf("The top element is %d\n", (int)Peek(new_stack));
Run Code Online (Sandbox Code Playgroud)