【发布时间】:2021-06-13 05:40:43
【问题描述】:
我很难完全理解和学习指针、强制转换等的行为。
我有以下结构,基本上是stack data structure:
struct stack
{
void **items;
size_t top;
size_t max_size;
};
我希望能够返回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));
在Segmentation fault (core dumped) 进入Peek 函数后,我立即得到它。
我猜这与我对Peek() 的返回值所做的*(int *) 强制转换有关,但我想不出print() 的任何其他方式或显示@987654333 传递的任何值@。我的意思是,我必须将其转换为 int * 或 char * 或其他,对吧?
我在这里做错了什么?我很高兴听到有关如何更好地理解整个pointers 事情的任何提示。我的意思是,我以为我很擅长,但我想我错了。
说实话,一开始我以为我需要将1,2 and 3 转换为(void *)&1、(void *)&2、(void *)&3,因为我认为我不能就这样通过它们,我想如果我想将int 转换为void * 我必须给它address 的int。
但是编译器对我大吼大叫,所以我改成Push(new_stack, (void *)3);
【问题讨论】:
-
这个问题的答案在很大程度上取决于函数 CreateStack 和 Push 的实现,我想知道您为什么没有在问题中包含该代码。鉴于您发布的内容,没有人可能会提供帮助。
-
@JJF 在这种情况下不是。该错误实际上在此处发布的代码中很明显。
-
(void *)1result sin“结果是实现定义的,可能没有正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示”。它可能不会往返于 1。
标签: c pointers data-structures stack void-pointers