V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
deweixu
V2EX  ›  程序员

下面的这段 C 语言,结构体的定义和初始化是什么意思? to.p_path

  •  
  •   deweixu ·
    deweixu · 2017-09-06 10:14:19 +08:00 · 2854 次点击
    这是一个创建于 2664 天前的主题,其中的信息可能已经有所发展或是发生改变。
    
    typedef struct {
    	char	*p_end;			/* pointer to NULL at end of path */
    	char	*target_end;		/* pointer to end of target base */
    	char	p_path[PATH_MAX];	/* pointer to the start of a path */
    } PATH_T;
    
    static char emptystring[] = "";
    PATH_T to = { to.p_path, emptystring, "" };
    
    
    12 条回复    2017-09-06 17:37:56 +08:00
    knva
        1
    knva  
       2017-09-06 10:34:48 +08:00
    百度 typedef
    deweixu
        2
    deweixu  
    OP
       2017-09-06 11:05:58 +08:00
    @knva 重点不是 typedef 啊,是

    `PATH_T to = { to.p_path, emptystring, "" };`
    Shura
        3
    Shura  
       2017-09-06 11:13:00 +08:00 via Android   ❤️ 1
    @deweixu to 是 PATH_T 类型,`PATH_T to = { to.p_path, emptystring, "" };`是给 to 整体赋值,to.p_path 为数组的首元素的地址,赋值给 tp.p_end。
    suikator
        4
    suikator  
       2017-09-06 11:21:16 +08:00 via Android
    C99 标准?
    wuddds
        5
    wuddds  
       2017-09-06 11:22:40 +08:00
    @Shura to 已经初始化了?
    feiyuanqiu
        6
    feiyuanqiu  
       2017-09-06 11:24:22 +08:00
    我估计楼主想问的是为什么可以用 to.p_path 初始化 to.p_end

    因为 to.p_path 在 to 声明时就分配了内存空间
    Shura
        7
    Shura  
       2017-09-06 11:29:35 +08:00 via Android
    @wuddds 声明时已经分配空间了
    zergmk2
        8
    zergmk2  
       2017-09-06 11:30:25 +08:00
    这个是 GCC 初始化结构体的一种方法
    PATH_T to = { to.p_path, emptystring, "" }; 相当于
    PATH_T to = {
    .p_end = to.p_path,
    .target_end = emptystring,
    .p_path = ""
    };
    z0z
        9
    z0z  
       2017-09-06 11:52:14 +08:00
    如果有条件的话,楼主在机器上试一下就知道了,估计是在面试?

    1 #include<stdio.h>
    2 #include<string.h>
    3 #include<stdlib.h>
    4
    5 #define PATH_MAX (8)
    6
    7 typedef struct
    8 {
    9 char *p_end;
    10 char *target_end;
    11 char p_path[PATH_MAX];
    12 }PATH_T;
    13
    14 static char emptystring[]="";
    15 PATH_T to = {to.p_path,emptystring,""};
    16
    17 int main(void)
    18 {
    19 printf("emptystring=0x%x\n",emptystring);
    20 printf("to.p_end=[0x%x],to.target_end=[0x%x],to.p_path=[0x%x]\n",to.p_end,to.target_end,to.p_path);
    21
    22
    23 return 0;
    24 }


    xx@server:~/temp/testtype$ ./test
    emptystring=0x601068
    to.p_end=[0x601050],to.target_end=[0x601068],to.p_path=[0x601050]
    xx@server:~/temp/testtype$
    deweixu
        10
    deweixu  
    OP
       2017-09-06 13:10:58 +08:00
    deweixu
        11
    deweixu  
    OP
       2017-09-06 13:17:48 +08:00
    @Shura 那么 p_path 和 p_end 指向同一个地址了哦?
    Shura
        12
    Shura  
       2017-09-06 17:37:56 +08:00 via Android
    @deweixu 对,p_path 指向了 p_end 所在的地址
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   926 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:37 · PVG 06:37 · LAX 14:37 · JFK 17:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.