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指向的那块内存丢失,内存泄漏

  • 相关阅读:
    [hdu6271]Master of Connected Component
    [hdu5468]Puzzled Elena
    [hdu4582]DFS spanning tree
    [poj2054]Color a Tree
    [luogu4107]兔子和樱花
    整除的尾数[HDU2099]
    胜利大逃亡[HDU1253]
    Bitset[HDU2051]
    折线分割平面[HDU2050]
    不容易系列之(4)——考新郎[HDU2049]
  • 原文地址:https://www.cnblogs.com/yougmi/p/4468796.html
Copyright © 2011-2022 走看看