zoukankan      html  css  js  c++  java
  • 初始化char指针--赋值和strcpy() 本质区别【转】

    原文地址:http://hi.baidu.com/todaygoodhj/item/0500b341bf2832e3bdf45180

    使用常量字符串初始化char指针,或者使用strcpy复制,从语法上我觉得都是可以的。但是,在这个例子中选择了后者,我觉得是有其他考虑的。
    因为,ctermid_name是全局的,可能用来传送数据,将str指向这个地址,可能会和其他的函数同步一个内存变量;而使用常量初始化:str="/dev/tty",那么系统会分配地址,这样str的地址是随机的。


    个人认为区别在于这里。


    “str="/dev/tty",那么系统会分配地址,这样str的地址是随机的。”

    系统没有分配地址,str的数值是固定的。就和全局ctermid_name是固定的一样。因为"/dev/tty"是固定地址。 

    在看APUE时遇到一个问题,问题如下:

    #include     <stdio.h>
    #include     <string.h>

    static char ctermid_name[L_ctermid];

    char *
    ctermid(char *str)
    {
        if (str == NULL)
            str = ctermid_name;
        return(strcpy(str, "/dev/tty"));    /* strcpy() returns str */
    }

    在这个函数里,为啥用strcpy给指针赋值,而不直接赋值呢?


    用以下简图来说明楼主的问题,直接赋值和拷贝是不一样的且为什么用拷贝而不用直接赋值.
         strcpy(str."/dev/tty")
                   ______________
    str-------->|__|__|__|__|__|
                                 ^
                                 |copy过去 覆盖原有内容.
                    ________|_____
                   |/dev/tty      |
                    ----------------
    str="/dev/tty"

                     ____________
    str<------|/dev/tty      | 只把字符指针传给str,而str指的原来区域的内容未改变.引起的可能后果就
               ---------------
    是原来str指向的那块内存丢失,内存泄漏

  • 相关阅读:
    使用Loadrunner监控Windows资源
    Tomcat使用线程池配置高并发连接
    性能测试中遇到的坑
    本地eclipse启动tomcat后无法访问
    Linux常用命令汇总
    Dubbo底层采用Socket进行通信详解
    今天遇到了一个Spring出现的一个未知错误,分享下
    maven pom.xml 详细
    Oracle 数据库中在使用中文模糊查询时输入中文查询不到结果的解决方法
    mybatis属性详解
  • 原文地址:https://www.cnblogs.com/yougmi/p/4468796.html
Copyright © 2011-2022 走看看