【问题标题】:How to print the values pointed by an array of void pointers如何打印空指针数组指向的值
【发布时间】:2015-03-17 14:34:04
【问题描述】:

我已经定义了一个结构来保存一组任何类型的值,这就是为什么 void **data.如果有人帮助我如何通过 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
}

谢谢。

【问题讨论】:

  • printf("%s \n", (char *)vp[i])

标签: c arrays pointers void


【解决方案1】:

如果数据可以是任何类型的变量。您可能需要在结构group 中再添加一个类似于data_type 的字段来判断data 的类型。

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;
    }
}

目前您的数据指向字符串printf() 需要"%s" 知道它需要打印字符串。然后在 vp[] 中对项目进行类型转换,以消除printf() 给出的警告,即您传递了不兼容的指针。

 printf("%s \n", (char *)vp[i])

【讨论】:

  • 如果某一组的数据类型与char*不同会怎样?
  • 那么你需要在组中再增加一个变量来告诉指针有什么样的数据。
  • 是的,这就是 OP 的要求。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我想这段代码sn-p在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->使用适当转换的数据的实际类型。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多