在这段视频中,取自斯坦福大学的CS107讲座,教授似乎表示,对一个char *施放一个void *会在算术方面做同样的事情,就像把它投射到一个无符号长的那样。
http://www.youtube.com/watch?v=_eR4rxnM7Lc&t=44m30s
有问题的部分从44:30到46:00左右
他说他们是“两个4字节的数字”
我理解将void *转换为char *,因为它假设算术是sizeof(char)= 1。 但我不知道如何通过将它转换为无符号长*来做同样的事情,因为算术将以4为单位。我缺少什么?
答案 0 :(得分:2)
他说他们是“两个4字节的数字”
在某个特定平台上可能也是如此,但一般都不能保证这种情况。
但我不知道如何通过将它转换为无符号长*来做同样的事情,因为算术将以4为单位。我缺少什么?
他没有施放到unsigned long*
,他正在施放到unsigned long
。
答案 1 :(得分:0)
该声明在去年特定星期二的特定机器上可能是正确的,但总的来说,这是错误的。如果可以对char *
和unsigned long
进行相同的处理,则C不需要两种不同的类型。
教授可能想说的是以下规则:
对于任何指针类型的变量(void
指针除外),以下成立:p + 1 == (T*) (((char*)p) + sizeof(*p))
(其中T
是*p
的类型),即添加1指针增加它指向的类型的大小。
由于sizeof(char) == 1
,如果x+1
的类型为x
或char *
,unsigned long
具有相同的值,sizeof(char *) == sizeof(unsigned long)
除非“你知道你在做什么”,否则不要假设。
请注意,实际表示可能因各种原因而有所不同,最明显的是因为unsigned long
在其表示中的任何位置都可能有填充位。