如何在 C 中打印 (void **) 数据?

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,因为我觉得我不能不去就这样,我想,如果我想投一个intvoid *我已经给它addressint.

但是编译器对我尖叫,所以我把它改成了 Push(new_stack, (void *)3);

Bar*_*mar 6

由于您在推动时将an 转换int为 a void *,因此您需要int在偷看时将其转换回 an ,而不是int *。您不是在堆栈中存储指向整数的指针,而是将整数本身视为指针。

printf("The top element is %d\n", (int)Peek(new_stack));
Run Code Online (Sandbox Code Playgroud)

  • @NoobCoder 指针的值应该是一个地址,但 `(void *)3` 无论如何都只是将 3 塞入其中。现在你有一个值为 3 的 `void*`,而不是某个东西的地址。您必须执行相反的转换才能取出您过去塞入值的值:由于您一开始将“int”转换为“void*”,所以相反的操作是将“void*”转换为“ int`。 (2认同)