首页 > 解决方案 > char * ptr = ""; 有什么区别?char * ptr = NULL 和 char * ptr = malloc(1)?

问题描述

我目前在 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

提前致谢

标签: c++arduino

解决方案


当你这样做时:

char * ptr = malloc(1);

您只为单个字节分配了足够的空间。然后,当您尝试strcat或对其进行strcpy任何操作时,您正在写入超出分配内存的范围。这会调用未定义的行为

分配""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,"\"");

推荐阅读