• C陷阱与缺陷 第3章 语义“陷阱” 3.4 避免“举偶法”


    避免“举偶法”
    “举偶法”(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。但是,这种写法不值得提倡。 

  • 相关阅读:
    学习SLAM:SLAM进阶(十)暴力更改ROS中的PCL库
    淘宝/天猫API:item_search_best-天猫畅销榜
    混淆矩阵和相应参数详解
    Java面经整理
    python读取图像小工具
    SRS流媒体服务器:服务器读取RTMP推流数据
    redis常识
    计算机毕业设计之java+ssm直销模式下家具工厂自建网站
    智能合约语言(eDSL)—— proc_macro实现合约init函数
    还未入职,这位将来的博导为学生规划了一条高效学习之路
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/125876562