char * ptr =“”和有什么区别? char * ptr = NULL,而char * ptr = malloc(1)?

时间:2019-05-21 18:07:03

标签: c++ arduino

我目前正在Arduino平台上工作,我试图通过char []和指针摆脱所有字符串,以避免Arduino nano的内存出现问题。以下代码用于生成字符串并传递给需要char *的函数:

char * ptr = "";
strcpy(ptr, "AT+CWJAP=\"");
strcat(ptr, wifi_ssid);
strcat(ptr,"\",\"");
strcat(ptr,WIFI_PASS);
strcat(ptr,"\"");
Serial.println(ptr);
addToPipe(ptr);

其中:

void ESP8266::addToPipe(char  * cmd) {
  for(pipeSlot = 0; pipeSlot < PIPEMAXSIZE; pipeSlot++) {
    if(isCharArrayEmpty(pipe[pipeSlot])){
      Serial.print("Slot is Empty. New data:");
      Serial.println(cmd);
      pipe[pipeSlot] = cmd;
      pipeSlot = PIPEMAXSIZE; //for breaking loop
    } else {
      Serial.print("Slot is Full with:");
      Serial.println(pipe[pipeSlot]);
    }
  }
  printPipe();
}

但是由于某些非显而易见的原因,指针ptr连续在串行端口中打印。但是,通过使用以下命令更改上面的字符串生成:

char * ptr = malloc(1);
strcpy(ptr, "AT+CWJAP=\"");
strcat(ptr, wifi_ssid);
strcat(ptr,"\",\"");
strcat(ptr,WIFI_PASS);
strcat(ptr,"\"");
Serial.println(ptr);
addToPipe(ptr);

似乎可以解决该问题。问题是,两者之间有什么区别?

1. char * ptr = "";
2. char * ptr = malloc(1);
3. char * ptr = NULL

预先感谢

1 个答案:

答案 0 :(得分:4)

执行此操作时:

char * ptr = malloc(1);

您只为单个字节分配了足够的空间。然后,当您尝试对其进行strcatstrcpy任何操作时,您正在写的内容已超出分配的内存范围。这将调用undefined behavior

""分配给ptr也将不起作用,因为它现在指向(空)字符串文字,并且字符串文字无法修改。分配NULL也不起作用,因为取消引用NULL指针是未定义的行为。

您需要分配足够的空间来容纳整个字符串以及终止的空字节:

char *ptr = malloc(10 + strlen(wifi_ssid) + 3 + strlen(WIFI_PASS) + 1 + 1);
strcpy(ptr, "AT+CWJAP=\"");
strcat(ptr, wifi_ssid);
strcat(ptr,"\",\"");
strcat(ptr,WIFI_PASS);
strcat(ptr,"\"");
相关问题