C 如何打印由空指针数组指向的值

C 如何打印由空指针数组指向的值,c,arrays,pointers,void,C,Arrays,Pointers,Void,我定义了一个结构来保存任何类型的一组值,这就是void**数据的原因。如果有人能帮助我通过一组空指针打印值指针,我将不胜感激。 结构如下 typedef struct item{ void **data;//array of void pointer to store names of the group-members int count;//number of members in the group struct item *next; //pointer to the

我定义了一个结构来保存任何类型的一组值,这就是void**数据的原因。如果有人能帮助我通过一组空指针打印值指针,我将不胜感激。

结构如下

typedef struct item{
   void **data;//array of void pointer to store names of the group-members
   int count;//number of members in the group
   struct item *next; //pointer to the next group in the pool queue
} group;
现在,假设创建了一个组,如下所示:

group *gp = (group*) malloc(sizeof(group));
void *a[2];
a[0] = (void*) "John";
a[1] = (void*) "Jim";
gp->data = a;
gp->count = 2;
在某些时候,可能在另一个函数中,如果需要打印组节点的值数组,我应该编写什么代码?下面是这样一个函数:

void print_group_node(group *gp)
{
   //I have the check for vp==NULL here
   void **vp = gp->data;
   int c = gp->count;
   int i;
   for(i = 0; i < c; i++)
      printf();//what should I write here
   //other codes here
}
void print\u group\u节点(组*gp)
{
//我在这里检查vp==NULL
作废**vp=gp->数据;
INTC=gp->count;
int i;
对于(i=0;i

谢谢。

如果数据可以是任何类型的变量。在结构
中,您可能还需要一个类似于下面的
数据类型
的字段来说明
数据
的类型

typedef struct item{
   ....
   int data_type; // 0: int, 1: char * (string), ...
} group;
并根据需要使用适当的
printf()

void print_group_node(group *gp)
{
   //I have the check for vp==NULL here
   void **vp = gp->data;
   int c = gp->count;
   int i;
   for(i = 0; i < c; i++)
   switch (gp->data_type) {
      case 0:
           printf("%d \n", (int*)vp[i])
           break;
      case 1:
           printf("%s \n", (char *)vp[i])
           break;
      Default:
           printf("Unknown type");
           break;
    }
}

不能以常规方式打印任意类型的值。您可以以某种方式存储类型信息并自定义
print
函数,以便它支持所有可能的类型。

我假设此代码段位于函数main中

group *gp = (group*) malloc(sizeof(group));
void *a[2];
a[0] = (void*) "John";
a[1] = (void*) "Jim";
gp->data = a;
gp->count = 2;
当本地数组
void*a[2]时,您将访问动态分配结构的数据成员处于活动状态。
否则,最好分配gp->data指向的额外内存。比如说

group *gp = (group*) malloc(sizeof(group));
gp->data = malloc( 2 * sizeof( void * ) );
gp->data[0] = "John";
gp->data[1] = "Jim";
gp->count = 2;
在这种情况下,要在其他函数中输出这些数据,您需要知道指针gp->data的实际类型,以便使用适当的强制转换

因此,如果您确切地知道数据的实际类型是
char**
,那么您可以在其他函数中编写

   for(i = 0; i < c; i++)
      printf( "%s\n", ( char * ) gp->data[i] );
(i=0;i printf(“%s\n”,(char*)gp->data[i]);

否则,您需要枚举将与结构一起使用的所有类型,并添加相应的数据成员,用于确定指针的实际类型。

printf(“%s\n”,(char*)vp[i])
如果一个组的数据类型不同于
char*
,会发生什么情况?那么您需要在组中再添加一个变量,告诉指针有什么类型的数据。是的,这就是OP所要求的。
 printf("%s \n", (char *)vp[i])