head的类型是NODE *,然后强制转换成void *,并赋值给c,TC结构体的第一个元素类型也是NODE *,这个元素是能对上的,其本质就是让c指向了tr的head所指向的内存,并把这块内存强制的认为是TC类型的,也就是说,c实际上是强制使用了别的变量的内存,并把head这块内存之后的sizeof(TC)大小的空间给了c(实际上是c强制占用的,这可能会导致内存出错,慎用),既然c有了内存空间,所以就可以对cnt进行++操作。所以,他们之间并没有什么对照关系,就是强制的内存占用(按字节大小和顺序依次分配)
具体要看这LIST对象你是怎么赋值的,如果给head实际赋值的是一个实际指向LIST对象的指针,那么这么转换是OK的。如果只是一个Node指针,那确实是错误的。
指针的灵活性就在于它实质就是一个地址而已,这个地址后面的内存块是怎么组织的,只有编程的人才知道。至于指针具体的类型,只是为了方便大家识别,但不是决定性的。就好比文件后缀名,你是可以随便写的,所以后缀是txt未必就是文本格式
编译器没有报错?将void* 的指针赋值给TC*????