C - повторное выполнение printf () с% s и char * - PullRequest
0 голосов
/ 06 марта 2011
char * src_addr;
char * dst_addr;

src_addr = inet_ntoa(ip->ip_src);
printf("src: %s\n", src_addr);

dst_addr = inet_ntoa(ip->ip_dst);
printf("dst: %s\n", dst_addr);

printf("src: %s\n", src_addr);

Это выведет dst_addr в третьем выражении printf.Я что-то не так делаю?

Ответы [ 2 ]

4 голосов
/ 06 марта 2011

Из документации: inet_ntoa () возвращает строку точек и чисел в статическом буфере, который перезаписывается при каждом вызове функции.

Итак, в вашем случае второй вызов inet_ntoa дает вам новую строку, но в том же буфере, поэтому dst_addr указывает на то же самое, что и src_addr, которые теперь оба указывают на новую строку назначения.

1 голос
/ 06 марта 2011

Я предполагаю, что вы используете IPv4.Эта функция НЕ работает с IPv6;используйте inet_ntop() или inet_pton() для IPv6.

Функция возвращает указатель на статический внутренний буфер, который inet_ntoa() постоянно использует повторно.Ваши src_addr и dst_addr будут указывать на один и тот же буфер, и строка, созданная последним вызовом inet_ntoa(), будет храниться там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...