inet_ntoa()返回一个字符指针,但我指的是它指向,堆叠或堆的地方?
char* func(unsigned int n){
char *p = inet_ntoa(n);
return p;
}
p指向的字符串的生命周期和范围是什么?
答案 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);
p1
和p2
将指向同一个缓冲区,并且都具有最近一次调用inet_ntoa()
的IP地址。这也意味着您无法在不提供自己锁定的情况下从多个线程调用inet_ntoa()
。 (1)
(1) - 某些实现对它返回的缓冲区使用线程局部变量,在这种情况下,inet_ntoa()是线程安全的,但仍然不是可重入的。在这种情况下,返回指针的生命周期也将一直持续到线程结束,直到整个应用程序结束。