inet_ntoa返回一个指针,但它指向哪里,堆栈还是堆?

时间:2015-11-12 14:37:37

标签: network-programming

inet_ntoa()返回一个字符指针,但我指的是它指向,堆叠或堆的地方?

char* func(unsigned int n){
    char *p = inet_ntoa(n);
    return p;
}

p指向的字符串的生命周期和范围是什么?

1 个答案:

答案 0 :(得分:2)

它指向一个静态分配的缓冲区,它的生命周期是在应用程序(或线程)结束之前。

您可以将inet_ntoa视为大致:

static char buffer[BIG_ENOUGH]
char *inet_ntoa(struct in_addr in)
(
    //perform conversion to ascii into "buffer"
    return buffer;
}

请注意,inet_ntoa()不可重入。这意味着它重用了相同的缓冲区,所以使用以下代码:

char *p1 = inet_ntoa(a);
char *p2 = inet_ntoa(b);

p1p2将指向同一个缓冲区,并且都具有最近一次调用inet_ntoa()的IP地址。这也意味着您无法在不提供自己锁定的情况下从多个线程调用inet_ntoa()。 (1)

(1) - 某些实现对它返回的缓冲区使用线程局部变量,在这种情况下,inet_ntoa()是线程安全的,但仍然不是可重入的。在这种情况下,返回指针的生命周期也将一直持续到线程结束,直到整个应用程序结束。