用户操作
[即时聊天] [发私信] [加为好友]
邓际锋ID:soloist
84737次访问,排名1139好友1人,关注者2
soloist的文章
原创 39 篇
翻译 0 篇
转载 0 篇
评论 189 篇
soloist的公告
欢迎吹毛求疵,感谢您对任何错误的指正,包括技术的、语法的、用词的、标点的、典故的、引用资料的……
最近评论
qingbai:lua绝对是个好东西。但国内除了java就是.net,其他东西没法活。因为程序员得工作,得吃饭。国内有哪家公司用lua?唉没办法呀。国外是一片繁荣,“百家争鸣”,国内是“青一色”的java和.net!无奈!
zhangyilan:尽管没有在实际代码的编写中碰到这个问题,不过也先学习一下,免得出现问题了搞出清楚情况。
ddrmsdos:这篇文章写的太好了,分析的非常仔细,以前常常碰到这类问题,终于解了我多年的心头之患......
ollydbg23:楼主的这篇文章写的非常好啊!
我看了以后,还是挺有收获感的,多谢多谢!
我也是对汇编,c++的比较感兴趣,有空可以交流一下!
w2001:写得很好
文章分类
收藏
    相册
    好博链接
    C++罗浮宫
    cpper
    fixopen
    fmddlmyy
    neoragex2002
    whinah
    云风
    梦想风暴
    沉思者
    许式伟
    负暄琐话
    辣子鸡丁
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 gcc的一个小bug收藏

    新一篇: 入职了 | 旧一篇: OpenLua简介:一个支持静态元编程的可扩展式开放编译器

        在C语言里有一个通用指针,即void*类型指针。通用指针有一条特殊的性质:任何一个指向某种类型(非函数类型)数据的指针转型为通用指针后再转换回原始类型,指针(的值)不会改变。换句话说,任何非函数类型的指针与通用指针间的互相转型(以及赋值)是(语法上)合法且(语义上)安全的。

        通用型指针实际是一种类型未知的指针,因此不能对它解引用(dereference)和施行下标(subscripting)操作,也不能把它加加减减。

        根据以上描述,下面这段程序

    /* fool.c */
    void foo(void *p)
    {
       ++p;
    }

    显然就是非法的。

        可是作者在Win2000平台上用gcc -S fool.c(MinGW 3.1.0,其中gcc为3.2.3版本)却顺利编译通过了上述代码,生成的汇编码如下:

    _foo:
       pushl %ebp
       movl  %esp, %ebp
       incl  8(%ebp)
       popl  %ebp
       ret

    注意incl  8(%ebp)这条指令,显然gcc把void*指针当成了char*指针,并对它施行了相应的自增操作(前进一个byte)。真是自作聪明!

        大家不要误以为这是gcc为了兼容老程序而有意为之,实际上史前的C根本没有void*型指针,也就不存在所谓兼容问题了。编译器这种不声不响的小动作不太惹人注意,但危险可是大大的,程序员千万要保持警惕!

        试试VC6.0,用cl /c fool.c编译,会得到一个"error C2036: 'void *' : unknown size"的错误信息。嗯,这才对头!

        这一次Visual C++的表现好于gcc,值得表扬。

    发表于 @ 2006年03月31日 22:37:00|评论(loading...)|编辑

    新一篇: 入职了 | 旧一篇: OpenLua简介:一个支持静态元编程的可扩展式开放编译器

    评论

    #SSO 发表于2006-04-10 17:17:00  IP: 219.138.196.*
    的确是bug... C++的编译器还是追新版本巴... 偶以前的 gcc 对模板和名字空间有诡异bug,后来换了新的就好了。

    偶手头的 gcc (GCC) 3.4.2 (mingw-special) 正确报错。
    #清风雨 发表于2006-05-17 19:48:00  IP: 58.247.3.*
    “史前的C根本没有void*型指针”
    这个说法不对吧!考虑C库函数,一堆的void *。如 :
    void *memcpy( void *dest, const void *src, size_t count );等
    #soloist 发表于2006-05-17 22:33:00  IP: 218.78.226.*
    To 清风雨 :
    依据《C语言参考手册》137页上的说法,传统C习惯用char*型指针作为通用指针,在deference的时候再将它们强制转换为正确的类型;标准C则特别引入了void*作为通用指针类型。
    现在看到的标准库函数绝大部分都是C89标准出来之后编写的,所以能看到大量的void*的使用。
    #清风雨 发表于2006-05-18 14:24:00  IP: 58.247.3.*
    难怪我总觉得char *strcpy( char*dest,const char *source )怪怪的,感觉
    const char *strcpy( void *dest,const char *source )更适合。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © soloist