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
相关产品推荐
相关产品推荐

