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