如何在 C 中打印 (void **) 数据?
How can I print a (void **) data in C?
我很难完全理解和学习指针、转换等所有行为。
我有以下结构,基本上是一个 stack data structure
:
struct stack
{
void **items;
size_t top;
size_t max_size;
};
我希望能够 return top element
,所以这是我的 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
函数后立即得到一个 Segmentation fault (core dumped)
。
我猜这与我对 Peek()
的 return 值所做的 *(int *)
转换有关,但我想不出任何其他方法来 [=21] =] 或显示由 void *
传递的任何值。我的意思是,我必须将其转换为 int *
或 char *
或其他任何格式,对吧?
我在这里做错了什么?我很高兴听到有关如何更好地理解整个 pointers
事情的任何提示。我的意思是,我认为我很擅长,但我想我错了。
说实话,一开始我觉得我需要把1,2 and 3
转成(void *)&1
,(void *)&2
,(void *)&3
,因为我觉得我过不了他们就像那样,我认为如果我想将 int
转换为 void *
我必须给它 address
的 int
.
但是编译器骂我,所以我改成了Push(new_stack, (void *)3);
因为你在推送时将 int
转换为 void *
,所以你需要在查看时将其转换回 int
,而不是 [=14] =].您没有在堆栈中存储指向整数的指针,而是将整数本身视为指针。
printf("The top element is %d\n", (int)Peek(new_stack));
我很难完全理解和学习指针、转换等所有行为。
我有以下结构,基本上是一个 stack data structure
:
struct stack
{
void **items;
size_t top;
size_t max_size;
};
我希望能够 return top element
,所以这是我的 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
函数后立即得到一个 Segmentation fault (core dumped)
。
我猜这与我对 Peek()
的 return 值所做的 *(int *)
转换有关,但我想不出任何其他方法来 [=21] =] 或显示由 void *
传递的任何值。我的意思是,我必须将其转换为 int *
或 char *
或其他任何格式,对吧?
我在这里做错了什么?我很高兴听到有关如何更好地理解整个 pointers
事情的任何提示。我的意思是,我认为我很擅长,但我想我错了。
说实话,一开始我觉得我需要把1,2 and 3
转成(void *)&1
,(void *)&2
,(void *)&3
,因为我觉得我过不了他们就像那样,我认为如果我想将 int
转换为 void *
我必须给它 address
的 int
.
但是编译器骂我,所以我改成了Push(new_stack, (void *)3);
因为你在推送时将 int
转换为 void *
,所以你需要在查看时将其转换回 int
,而不是 [=14] =].您没有在堆栈中存储指向整数的指针,而是将整数本身视为指针。
printf("The top element is %d\n", (int)Peek(new_stack));