首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  程序员

c 语言套接字编程怪事件

  •  1
     
  •   b00tyhunt3r · 80 天前 · 1461 次点击
    这是一个创建于 80 天前的主题,其中的信息可能已经有所发展或是发生改变。
    int main()
    
    {
      struct addrinfo* c;   //创建套接字结构
      char host[1024],serv[1024];
      getaddrinfo("163.com","http",NULL,&c); //取得猪厂 ip 地址及 http 端口号
      int flags = NI_NUMERICSERV; //令服务显示为端口号
      getnameinfo(c->ai_addr,c->ai_addrlen,host,1024,serv,1024,flags);
      printf("host:%s,serv:%s\n",host,serv); //打印 ip 及端口号
      
      freeaddrinfo(c);  //事件起点,释放套接字结构 c                 
      if(!c) 
            printf("c is gone\n");//如果 c 被释放了,打印“c is gone”
      else
     	printf("c is there\n"); //如果 c 没有被释放,打印“c is there”
    	
    }
    

    运行结果: bash-3.2$ ./a.out host:123.58.180.8,serv:80 c is there

    为什么这个结构 c 明明被我 freeaddrinfo 了,还是依然阴魂不散呢?

    16 回复  |  直到 2019-09-26 16:54:48 +08:00
        1
    WordTian   80 天前 via Android   ♥ 1
    你不是专门写 C 的吧,很明显的野指针啊
        2
    ysc3839   80 天前   ♥ 1
    因为你只是把 c 的值传给了 freeaddrinfo,freeaddrinfo 没办法修改 c。
        3
    LongMaoz   80 天前 via Android   ♥ 1
    编程没有玄学
        4
    si   80 天前   ♥ 1
    freeaddrinfo 没有置 0,只是释放,你要主动置 0。
        5
    fengtons   80 天前 via Android   ♥ 1
    c = NULL;
        6
    opengps   80 天前 via Android   ♥ 1
    猪厂是哪?
        7
    msg7086   80 天前   ♥ 1
    学一下 C 吧。
    指针指向 0 不代表内存被释放。
    内存被释放不代表指针会指向 0。
    两者是独立事件,所以你代码和注释都是错的。
        8
    b00tyhunt3r   80 天前 via iPad
    谢过各位大佬!
        9
    happy7902   80 天前 via iPhone
    高手,这是高手。
        10
    Mutoo   80 天前
    getaddrinfo 的参数是 &c
    而 freeaddrinfo 的参数是 c
    前者传的是指针 c 的地址,可以利用此修改该地址的值,即修改 c 本身
    后者则是值传递,传的是指针 c 的内容,顾无法修改 c 本身
        11
    qakito   80 天前
    函数形参了解一下
        12
    agostop   80 天前
    感觉这像是 java 程序员在写 C
        13
    LeeSeoung   80 天前
    java 也不是这么写的 楼上别引战。。
        14
    catcn   80 天前
    freeaddrinfo 传入的指针类型,是值传递,肯定不会修改或者设置为 NULL 啦。。
        15
    dosmlp   80 天前 via Android
    楼主去学学 c 语言基础吧
        16
    xdtr   80 天前   ♥ 1
    getaddrinfo 后 c 指向一个 addrinfo 结构链表。“The getaddrinfo() function allocates and initializes a linked list of addrinfo structures, one for each network address that matches node and service, subject to any restrictions imposed by hints, and returns a pointer to the start of the list in res. The items in the linked list are linked by the ai_next field.”
    由于调用 getaddrinfo 后动态分配内存,必须通过调用 freeaddrinfo 释放内存。“The freeaddrinfo() function frees the memory that was allocated for the dynamically allocated linked list res”。
    这就很清楚了,freeaddrinfo 并不会释放 c,所以 c 必须手动释放。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2512 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 13:45 · PVG 21:45 · LAX 05:45 · JFK 08:45
    ♥ Do have faith in what you're doing.