我试图在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编写泛型代码。