首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

链表里面的类型转换有关问题

2012-09-29 
链表里面的类型转换问题#include stdio.h#include string.h#include stdlib.htypedef struct me{voi

链表里面的类型转换问题
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct me
{
  void* data;
  struct me* head;
  struct me* tail;
}*ptrme, node;

ptrme Create()
{
  ptrme Head = NULL, Tail = NULL, New = NULL;
  char mychar = 'a';

  Head = (ptrme)malloc(sizeof(node));
  Head->head = NULL;
  Head->tail = NULL;

  Tail = Head;
  printf("input:");
  scanf("%c",&mychar);

  while(mychar != 'q')
  {
  New = (ptrme)malloc(sizeof(node));
  New->head = NULL;
  New->tail = NULL;
  Tail->head = New;
  Tail->tail = New;
  Tail = New;
  New->data = (char*)mychar; //我想问的就是这个地方 这样写会有警告
  //如果过这样写 New->data = (char*)&mychar; 会出现段错误 这是什么原因呢 大师帮我分析分析好吗  

  printf("input:");
  getchar();
  scanf("%c",&mychar);
  }

  return Head;
}

int main()
{
  ptrme Head = NULL;
  ptrme ptr;

  Head = (ptrme)malloc(sizeof(node));
  Head = Create();

  ptr = Head;
  while(ptr->head != NULL)
  {
  ptr = ptr->head;
  printf("%c\n", (char*)ptr->data);
  }
  free(Head);

  return 0;
}


[解决办法]
New->data = (char*)mychar;这样写就相当于把一个char 赋给int
New->data = (void*)&mychar;这样写是可以的 不过mychar是局部变量 函数走完 它就不在了 你下次用New->data访问不到的 会挂掉
[解决办法]
1、 void* data; 不要把变量定义为void

2、需要清楚左右值类型是否一致 data (void *) mychar(char) data = &((void)machar)
[解决办法]
不知道你什么编译器,我在VS2010上没有警告
改成New->data = (char*)&mychar;之后得不到想要的结果,
内存泄露了一大片,要是你这样开发程序的话,老板得把你骂死
看你这样写的代码没办法向你解释

[解决办法]
static char mychar = 'a';
[解决办法]
你这个程序,不规范的东西太多了
首先:
你这个程序其实实现的是单向链表,那为什么结构体要用两个指针head和tail?
完全可以换成一个next指针
第二,
你链表里的数据存的void*,没有什么实际意义,因为void*拿出来的时候还是要转换成其他指针才能被使用
为什么不存实际一点的数据类型呢? 如:char,int,double等
第三
你把一个字符mychar转换成char*干什么,既然你的数据类型是void* 为什么不转换为void*呢?char*表示C风格字符串,以'\0'为结束标志,而且mychar是char类型的(占一个字节),void*和char*都是占4个字节的,转换过去要补零,但是从void*转换成一个字节的char会发生什么,你了解吗(你把它转成char*)
第四
你用malloc都很随意啊,做软件最忌讳内存泄露了
在我看来你main函数中的Head = (ptrme)malloc(sizeof(node));完全不应该要
free(Head),你怎么知道Head一定不是空指针?还有它只是释放的是头节点的内存,你链表里面的其他元素就不释放了 ?
帮你写了一个释放链表的代码,你自己琢磨琢磨吧
ptrme p=NULL;
while(Head){
p=Head->next;//这里next就是你的代码里面的head和tail
free(Head);
Head=p;
}
其他的不规范的就不想说了
然后来回答你的问题吧
你把一个char的mychar转换成char*,占用的存储空间都不一样,警告很正常,
New->data = (char*)&mychar;这句话其实就是把mychar的地址给New->data,地址给它,每次都是一样的,而且后面输出肯定是有问题的,段错误应该不会出,我觉得

热点排行