【问题标题】:How can I print a (void **) data in C?如何在 C 中打印 (void **) 数据?
【发布时间】: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 * 我必须给它addressint

但是编译器对我大吼大叫,所以我改成Push(new_stack, (void *)3);

【问题讨论】:

  • 这个问题的答案在很大程度上取决于函数 CreateStack 和 Push 的实现,我想知道您为什么没有在问题中包含该代码。鉴于您发布的内容,没有人可能会提供帮助。
  • @JJF 在这种情况下不是。该错误实际上在此处发布的代码中很明显。
  • (void *)1 result sin“结果是实现定义的,可能没有正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示”。它可能不会往返于 1。

标签: c pointers data-structures stack void-pointers


【解决方案1】:

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

printf("The top element is %d\n", (int)Peek(new_stack));

【讨论】:

  • 谢谢!你能解释一下,当我们将它们转换为void * 时,为什么我们不需要分配那些intsaddress?例如,我的意思是(void *)&3?因为pointer 的值是一个地址.. 所以我猜我们需要像我们在声明和定义一个新指针时一样为他分配一个地址。
  • (void *)3 没有任何地址。如果您尝试取消引用它,您正在寻找内存位置 3 处的整数。
  • @NoobCoder 一个指针的值假定是一个地址,但(void *)3 只是在其中塞入一个 3。现在您有一个void*,其值为 3,而不是某物的地址。您必须进行相反的转换才能获得用于将值塞入其中的值:由于您首先将int 转换为void*,因此相反的是将void* 转换为int .
  • @Barmar 这就是我的意思!当我写(void *)3 时,我并没有真正将整数3int 转换为void *,我正在转换内存位置,地址3 将被这个void * 指向。当我想将它传递给接收void * elementstack*Push 函数时,我应该写其他东西而不是(void *)3 吗?
  • 你可以声明一个变量int foo = 3;Push(new_stack, (void *)&foo)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多