You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何同一条printf语句中连续调用ip_print函数输出相同字符串?

问题分析与解决:printf重复输出同一IP的原因

问题根源

你的代码出现重复输出的核心原因有两点:

  1. 全局缓冲区被覆盖
    ip_addr是全局字符数组,所有ip_print调用都会操作同一块内存。第二次调用ip_print("10.1.1.1")会覆盖第一次写入的内容,反之亦然——最终数组里只会保留最后一次写入的结果。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:45:42