c printf函数动态类型确定

时间:2013-01-13 10:22:43

标签: c linked-list stack runtime printf

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

2 个答案:

答案 0 :(得分: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;
  }
}

答案 1 :(得分: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");
  }
} 

Here is a Project/A book对于在C中编写通用代码非常有帮助。