代码中的“ sprintf”用法是否需要释放内存?

时间:2019-07-19 05:00:41

标签: c++ arduino

我正在Arduino中开发一个代码,其中我使用了“ sprintf”,是否需要知道之后是否应该使用“ free”来取消分配内存?

就像我使用“免费”时一样,它禁用了串行通信,如果没有必要,我可以绕过它,并且代码可以正常使用。

我已附上代码片段

请提出建议

谢谢

void setup() {
Serial.begin(115200);
}

int toString(char a[]) {
  int i, j ;
  int dec = 0;
  for(i=0; i<4; i++){
    dec = dec * 10 + ( a[i] - '0' );
  }
  return dec;
}

void loop() {
  // put your main code here, to run repeatedly:
  int val1 = 2;
  int val2 = 1;
  int val3 = 1;
  int val4 = 8;
  char valread[10];
  sprintf(valread, "%c%c%c%c", val1,val2,val3,val4);
  int VerifyMainpower = toString(valread);      
  free(valread);
  delay(5);
  if(VerifyMainpower < 2100 || VerifyMainpower > 2300){
    Serial.print("Error003_02");
    }  
  }

2 个答案:

答案 0 :(得分:4)

sprintf()只需写入您为其提供的缓冲区空间;它既不知道也不在乎缓冲区是如何分配的;这取决于您要处理的代码。

在所示的代码中,您不应调用free(valread),因为您没有使用malloc()(或calloc())进行分配。您应该只free()以前从堆中分配的内存。

答案 1 :(得分:0)

标准库不会执行任何动态内存操作(除了malloc之类的旨在完成工作的功能之外)。

因此,如果参数是局部变量,则不应释放内存。如果参数是从malloc创建的指针,则应最终释放它。