如何转换和打印结构成员的`void`指针数组?

huangapple go评论89阅读模式
英文:

How to covert and print the void pointer array of structure member?

问题

关于学习,我正在创建数据结构库,在那里我创建了堆栈的结构并添加了用于数组的void指针,当我尝试访问void指针数组的值时,会引发数据类型无效转换错误。有人能告诉我我哪里出错了?

  1. typedef struct
  2. {
  3. size_t size;
  4. size_t top;
  5. void *st_base;
  6. } stack_t;
  7. dsa_err_t stack_init(stack_t *stack, uint32_t size)
  8. {
  9. DSA_CHECK_ARG(stack);
  10. stack->st_base = (int32_t *)calloc((size_t)size, sizeof(int32_t));
  11. if (!(stack->st_base))
  12. {
  13. return DSA_NO_MEM;
  14. }
  15. stack->top = 0;
  16. stack->size = size;
  17. return DSA_OK;
  18. }
  19. dsa_err_t stack_push(stack_t *stack, int32_t item)
  20. {
  21. DSA_CHECK_ARG(stack && stack->st_base);
  22. if (stack->top >= (stack->size - 1))
  23. {
  24. return DSA_FAIL;
  25. }
  26. stack->st_base[(stack->top)++] = item; // 表达式必须是可修改的值错误
  27. return DSA_OK;
  28. }
  29. dsa_err_t stack_pop(stack_t *stack, int32_t *item)
  30. {
  31. DSA_CHECK_ARG(stack && stack->st_base);
  32. if (stack_is_empty(stack) || stack->top > (stack->size - 1))
  33. {
  34. return DSA_FAIL;
  35. }
  36. *item = (int32_t)stack->st_base[stack->top - 1]; // 无效类型转换错误
  37. stack->st_base[stack->top--] = 0;
  38. return DSA_OK;
  39. }

注意:上述翻译只包括代码部分,不包括问题或其他内容。

英文:

As for learning I was creating the library of data structure there I create the structure of stack and added the void pointer use for array and when I m trying to access the value of void pointer array is throw the invalid conversion of data type error. Can anyone tell me where I m doing wrong?

  1. typedef struct
  2. {
  3. size_t size;
  4. size_t top;
  5. void *st_base;
  6. } stack_t;
  7. dsa_err_t stack_init(stack_t *stack, uint32_t size)
  8. {
  9. DSA_CHECK_ARG(stack);
  10. stack->st_base = (int32_t *)calloc((size_t)size, sizeof(int32_t));
  11. if (!(stack->st_base))
  12. {
  13. return DSA_NO_MEM;
  14. }
  15. stack->top = 0;
  16. stack->size = size;
  17. return DSA_OK;
  18. }
  19. dsa_err_t stack_push(stack_t *stack, int32_t item)
  20. {
  21. DSA_CHECK_ARG(stack && stack->st_base);
  22. if (stack->top >= (stack->size - 1))
  23. {
  24. return DSA_FAIL;
  25. }
  26. stack->st_base[(stack->top)++] = item; ---> EXPRESSION MUST BE MODIFIABLE VALUE ERROR
  27. return DSA_OK;
  28. }
  29. dsa_err_t stack_pop(stack_t *stack, int32_t *item)
  30. {
  31. DSA_CHECK_ARG(stack && stack->st_base);
  32. if (stack_is_empty(stack) || stack->top > (stack->size - 1))
  33. {
  34. return DSA_FAIL;
  35. }
  36. *item = (int32_t)stack->st_base[stack->top - 1]; ---> INVALID TYPE OF CONVERSION ERROR
  37. stack->st_base[stack->top--] = 0;
  38. return DSA_OK;
  39. }

答案1

得分: 3

void * 是一个不完整的类型,因此无法进行解引用(而数组索引是解引用的一种形式)。您需要首先将其转换为可用的指针类型。

  1. ((int32_t *)stack->st_base)[(stack->top)++] = item;
  2. ...
  3. *item = ((int32_t *)stack->st_base)[stack->top - 1];
英文:

A void * is an incomplete type and therefore can't be dereferenced (and array indexing is a form of dereferencing). You need to convert it to a usable pointer type first.

  1. ((int32_t *)stack->st_base)[(stack->top)++] = item;
  2. ...
  3. *item = ((int32_t *)stack->st_base)[stack->top - 1];

huangapple
  • 本文由 发表于 2023年3月10日 01:22:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/75688022.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定