读书人

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

发布时间: 2012-09-29 10:30:01 作者: rapoo

链表里面的类型转换问题
#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,地址给它,每次都是一样的,而且后面输出肯定是有问题的,段错误应该不会出,我觉得

读书人网 >C++

热点推荐