3

我正在尝试使用 void 指针在 c 中实现一个通用堆栈来指向数据。结构看起来像这样

struct record{
  void* data;
  struct record* previousRecord; 
};

其中 void 指针数据是指向堆栈位置将保存的数据的指针。如果我实现这样的推送功能

struct record* push(struct record* tos, void* data){
  struct record* newtos = (struct record*)malloc(sizeof(struct record));
  newtos->data = data;
  newtos->previousRecord = tos;
  return newtos;
}

并将几个整数指针和字符串指针推入堆栈,有什么方法可以打印这些指针引用的值。我的问题是,如果我使用 printf 函数,我必须在代码中指定要打印的值的数据类型,但存储在堆栈中的值只能在运行时确定

4

2 回答 2

4

如果您想以正确的格式打印数据,您必须知道它的类型。

#include <stdio.h>

enum datatype
{
  DATATYPE_STRING, DATATYPE_INTEGER
};

struct record
{
  enum datatype type;
  void *data;
  struct record *next;
};

void print_record(struct record *p)
{
  switch (p->type)
  {
    case DATATYPE_STRING:
      printf("%s\n", (char *)p->data);
      break;
    case DATATYPE_INTEGER:
      printf("%d\n", *(int *)p->data);
      break;
  }
}
于 2013-01-13T10:28:10.310 回答
2

有了地址,你怎么知道数据的类型,它可以是字符串或整数地址:

但是您可以在record定义中保留一个关于存储在中的值类型的额外字段data part,如下所示:

typedef enum { STRING, INT, CHAR} type;
struct record{
  type t;
  void* data;
  struct record* previousRecord; 
};

并编写一个通用的打印函数:

int print(struct record  *r){  

  switch(r->t){
     case CHAR:     return printf("%c", *((char*)(r->data)));
     case INT:      return printf("%d", *((int*)r->data));        
     case STRING:   return printf("%s", (char*)r->data);        
     default:       return printf("Error");
  }
} 

这是一本对用 C 编写通用代码非常有帮助的项目/A 书。

于 2013-01-13T10:28:26.243 回答