IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    C陷阱与缺陷之避免“举隅法”

    TacuLee发表于 2016-01-02 09:57:15
    love 0

    “举隅法”(synecdoche)是一种文学修辞上的手段,有点类似于微笑表示喜悦,赞许之情,或以隐喻表示指代物与被指物的相互关系。在《牛津英语辞典》中,对“举隅法”(synecdoche)是这样解释的:“以含义更宽泛的词语来代替含义较窄的词语,或者相反;例如,以整体代表部分,或者以部分代表整体,以生物的类来代表生物的种,或者以生物的种来代表生物的类,等等。”

    《牛津英语辞典》中这一词条的说明,倒是恰如其份地描述了C语言中一个常见的“陷阱”;混淆指针与指针所指向的数据。对于字符串的情形,编程者更是经常犯这种错误。例如:

    char *p, *q;
    p = “xyz”;

    尽管某些时候我们可以不妨认为,上面赋值使得p就是字符串“xyz”,然而实际情况并不是这样,记住这一点尤其重要。实际上,p的值是一个指向’x’、’y’、’z’和’\0’4个字符组成的起始元素的指针。因此,如果我们执行下面的语句:

    q = p;

    p和q现在是两个指向内存中同一地址的指针。这个赋值语句并没有同时复制内存中的字符。我们可以用下图来表示这种情况:

    我们需要记住的是,复制指针并不同时复制指针所指向的数据。

    因此,当我们执行完下面的语句之后:

    q[1] = ‘Y’;

    q所指向的内存现在存储的是字符串“xYz”。因为p和q所指向的是同一块内存,所以p指向的内存中存储的当然也是字符串”xYz”。

    译注:ANSI C标准中禁止对string literal作出修改。K&R C中对这一问题的说明是,试图修改字符串常量的行为是未定义的。某些C编译器还允许q[1]=’Y’这种修改行为,如LCC v3.6.但是,这咱写法不值得提倡。

    未经允许不得转载:TacuLee » C陷阱与缺陷之避免“举隅法”



沪ICP备19023445号-2号
友情链接