为何同一条printf语句中连续调用ip_print函数输出相同字符串?
问题分析与解决:printf重复输出同一IP的原因
问题根源
你的代码出现重复输出的核心原因有两点:
- 全局缓冲区被覆盖
ip_addr是全局字符数组,所有ip_print调用都会操作同一块内存。第二次调用ip_print("10.1.1.1")会覆盖第一次写入的内容,反之亦然——最终数组里只会保留最后一次写入的结果。 - printf参数求值顺序未定义
C标准没有规定printf参数的计算顺序,编译器可能先执行第二个ip_print再执行第一个,也可能反过来。但不管顺序如何,两个%s对应的都是同一个全局数组的地址,printf打印时读取的是数组最终的内容(你的实际输出显示最后一次写入的是226.0.0.1)。
解决方案
要解决这个问题,关键是让每个ip_print调用拥有独立的存储缓冲区,避免共享全局内存:
方案1:动态分配内存
每次调用ip_print时分配新内存,用完后记得释放,防止内存泄漏:
#include <stdio.h> #include <string.h> #include <stdlib.h> char *ip_print(char *in) { char *addr = malloc(20); if (addr == NULL) return NULL; memset(addr, 0, 20); strcpy(addr, in); return addr; } int main() { char *ip1 = ip_print("226.0.0.1"); char *ip2 = ip_print("10.1.1.1"); printf("Ip addresses %s - %s", ip1, ip2); free(ip1); free(ip2); return 0; }
方案2:调用者提供缓冲区
让调用者传入自己的缓冲区,函数只负责写入内容,更安全且无内存泄漏问题:
#include <stdio.h> #include <string.h> char *ip_print(char *out, char *in, size_t size) { memset(out, 0, size); strncpy(out, in, size - 1); // 用strncpy避免缓冲区溢出 return out; } int main() { char ip1[20], ip2[20]; printf("Ip addresses %s - %s", ip_print(ip1, "226.0.0.1", sizeof(ip1)), ip_print(ip2, "10.1.1.1", sizeof(ip2))); return 0; }
方案3:直接使用字符串字面量(简单场景)
如果只是打印固定IP,完全不需要额外函数,直接在printf中传入字符串即可:
#include <stdio.h> int main() { printf("Ip addresses %s - %s", "226.0.0.1", "10.1.1.1"); return 0; }
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

