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

Arduino循环中assignIpAddress方法重复运行占用SRAM,求优化方案

解决Arduino中assignIpAddress方法重复调用的内存泄漏问题

你的代码存在内存泄漏:每次调用assignIpAddress时用calloc动态分配了内存,但没有在函数结束时释放,导致这块内存一直被占用,重复调用后SRAM会被逐步耗尽。下面是两种修改方案:

方法1:释放动态分配的内存

最简单的修改是在函数末尾添加free(tempstr);,把分配的内存还给系统:

void assignIpAddress(char* inputString) {
    char delims[] = ".";
    char* result = NULL;
    int a = 0;
    char* tempstr = calloc(strlen(inputString)+1, sizeof(char));
    if (tempstr == NULL) { // 防止内存分配失败导致后续错误
        return;
    }
    strcpy(tempstr, inputString);
    result = strtok(tempstr, delims);
    NetworkSettings.ipAddress[a] = byte(atoi(result));
    while (result != NULL) {
        a++;
        result = strtok(NULL, delims);
        if (result != 0) {
            NetworkSettings.ipAddress[a] = byte(atoi(result));
        }
    }
    free(tempstr); // 释放动态分配的内存,解决泄漏
}

方法2:避免动态内存分配(更推荐)

IP地址字符串最长仅15个字符(比如255.255.255.255),可以直接在栈上创建固定大小的缓冲区,彻底规避动态内存的泄漏风险:

void assignIpAddress(char* inputString) {
    char delims[] = ".";
    char* result = NULL;
    int a = 0;
    char tempstr[16]; // 栈上分配足够存IP的空间(含结束符)
    strncpy(tempstr, inputString, sizeof(tempstr)-1);
    tempstr[sizeof(tempstr)-1] = '\0'; // 强制保证字符串以结束符结尾,避免溢出
    result = strtok(tempstr, delims);
    if (result != NULL) { // 处理空输入的情况
        NetworkSettings.ipAddress[a] = byte(atoi(result));
        while (a < 3) { // 限制最多解析4段IP,防止数组越界
            a++;
            result = strtok(NULL, delims);
            if (result != NULL) {
                NetworkSettings.ipAddress[a] = byte(atoi(result));
            } else {
                break;
            }
        }
    }
}

额外说明:

  • 方法2中添加了a < 3的判断,避免输入格式错误时,ipAddress数组出现下标越界的问题。
  • strncpy比原代码的strcpy更安全,能防止过长的输入字符串导致缓冲区溢出。

内容的提问来源于stack exchange,提问作者nasarhon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 07:30:16