链接表的printf函数动态类型确定



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

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

,其中void指针数据是指向堆栈位置将保存的数据的指针。如果我实现像这样的push函数

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函数,我必须指定要在代码中打印的值的数据类型,但存储在堆栈中的值只能在运行时确定

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

#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("%sn", (char *)p->data);
      break;
    case DATATYPE_INTEGER:
      printf("%dn", *(int *)p->data);
      break;
  }
}

对于address,您如何知道数据的类型,它可以是字符串或整数地址:

但是您可以在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编写泛型代码。

相关内容

  • 没有找到相关文章

最新更新