如何用C打印a(void**)数据?

如何用C打印a(void**)数据?,c,pointers,data-structures,stack,void-pointers,C,Pointers,Data Structures,Stack,Void Pointers,我很难完全理解和学习指针、类型转换等行为 我有以下结构,它基本上是一个堆栈数据结构: struct stack { void **items; size_t top; size_t max_size; }; 我希望能够返回顶部元素,因此这是我的Peek函数: void *Peek(const stack_ty *stack) { return(stack->items[stack->top]); } 这是我在main.c中的测试打印:

我很难完全理解和学习指针、类型转换等行为

我有以下结构,它基本上是一个
堆栈数据结构

struct stack
{
    void **items;
    size_t top;      
    size_t max_size;
};
我希望能够返回
顶部元素
,因此这是我的
Peek
函数:

void *Peek(const stack_ty *stack)
{
    return(stack->items[stack->top]);
}
这是我在
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));
在进入
Peek
功能后,我得到了一个
分段错误(内核转储)

我可以猜测它与我对
Peek()
的返回值所做的
*(int*)
转换有关,但我想不出任何其他方法来
print()
或显示通过
void*
传递的任何值。我的意思是,我必须将它转换为
int*
char*
或其他类型,对吗

我做错了什么?我很高兴听到关于如何更好地理解整个
指针的任何提示。我是说,我认为我很擅长,但我猜我错了

老实说,一开始我认为我需要将
1,2和3
转换为
(void*)&1
(void*)&2
(void*)&3
,因为我认为我不能这样通过它们,我想如果我想把
int
转换成
void*
我必须给它
int
地址


但是编译器对我大喊大叫,所以我把它改为
Push(new_stack,(void*)3)

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

printf(“顶部元素是%d\n”,(int)Peek(新的_堆栈));

这个问题的答案在很大程度上取决于CreateStack和Push函数的实现,我想知道为什么您没有在问题中包含这些代码。鉴于您所发布的内容,可能没有人能够提供帮助。@JJF在这种情况下不提供帮助。错误实际上很清楚地存在于这里发布的代码中。
(void*)1
结果sin“结果是实现定义的,可能没有正确对齐,可能没有指向引用类型的实体,可能是陷阱表示”。它可能不是往返1。谢谢!你能给我解释一下,当我们将这些
int
强制转换为
void*
时,为什么不需要分配它们的
地址
?我是说以
(void*)&3
为例?因为
指针的值是地址。。所以我想我们需要给他分配一个地址,就像我们在声明和定义新指针时经常做的那样。
(void*)3
没有任何东西的地址。如果您试图取消引用它,您正在内存位置3中寻找一个整数。@NoobCoder指针的值应该是一个地址,但
(void*)3
只是在其中填充了一个3。现在有了一个
void*
,它的值是3,而不是某物的地址。你必须做相反的转换来获得你用来填充值的值:因为你开始是将
int
转换成
void*
,相反的是将
void*
转换成
int
@Barmar,这就是我的观点!当我写
(void*)3
时,我并不是真的将整数
3
int
转换为
void*
,我是在转换内存位置,地址
3
由该
void*
指向。当我想将它传递给接收
void*元素
stack*
Push
函数时,是否应该编写其他内容而不是
(void*)3
?您可以声明一个变量
int foo=3和推送(新的堆栈,(void*)&foo)