如何用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)