簡體   English   中英

如何打印由void指針數組指向的值

[英]How to print the values pointed by an array of void 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 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
}

謝謝。

如果數據可以是任何類型的變量。 您可能需要在結構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])

您無法以一般方式打印任意類型的值。 您可以以某種方式存儲類型信息並自定義您的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] );

否則,您需要枚舉要與結構一起使用的所有類型,並添加將用於確定指針實際類型的相應數據成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM