使用void指针在存储节点中存储任何类型的数据(可能是int char或结构)

时间:2014-01-25 12:13:09

标签: c pointers struct

#include<stdio.h>
#include<stdlib.h>

struct genericStorage
{
  void *data;
  int type;
};


struct genericNode
{
  struct genericStorage storage;
  struct genericNode *next;
};

struct genericNode *new,*temp;

struct genericNode* createGLL(int type)
{
  int a;
  char b;


  if(type==0)
    {
      new=(struct genericNode *) malloc (sizeof(struct genericNode));
      (new->storage).data=(int *) malloc (sizeof(int));
      printf("Enter Integer");
      scanf("%d",&a);
      *((int *)(new->storage.data))=a;
      new->storage.type=type;
      new->next=NULL;

    }
  else if(type==1)
    {
      new=(struct genericNode *) malloc (sizeof(struct genericNode));
      (new->storage).data=(char *) malloc (sizeof(char));
      printf("Enter Char");
      scanf("%c",&b);
      *((char *)(new->storage.data))='c';
      new->storage.type=type;
      new->next=NULL;

    }
    else if(type==2)
    {
      new=(struct genericNode *) malloc (sizeof(struct genericNode));
      temp=(struct genericNode *) malloc (sizeof(struct genericNode));
      temp=createGLL(1);
      (new->storage).data=(struct genericNode *)temp;
      new->storage.type=type;
      new->next=NULL;
    }
}

void print(struct genericNode *t)
{
  if(t->storage.type==0)
    printf("%d\n",*(int *)t->storage.data);
  if(t->storage.type==1)
    printf("%c\n",*(char *)t->storage.data);
  if(t->storage.type==2)
    printf("%c\n",*(struct genericNode *)(t->storage.data->(temp->storage).data));

}

int main()
{
  int type;

  struct genericNode *head;
  head=NULL;
  printf("Enter the type");
  scanf("%d",&type);
  getchar();
  head=createGLL(type);
  print(head);
  return 0;
}

我在打印功能中遇到问题,我必须打印存储在外部结构中的结构内的数据。如何访问内部结构中的数据并进行打印?请急需帮助。

1 个答案:

答案 0 :(得分:2)

(t->storage.data->(temp->storage).data)

这条线毫无意义。您正在尝试访问storage.data中的成员,但您可以通过temp获得对成员的另一个访问权限而不是有效成员的名称。它根本就不是C.

如果我理解您的代码t->storage.data可能是另一个指向genericNode的指针。在这种情况下,您可能希望改为:

if(t->storage.type == 2) {
    struct genericNode *node = t->storage.data;
    printf("Jumping to the inner genericNode at %p\n", (void *)node);

    print(node); /* Call print again. */
}