我目前正在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
预先感谢
答案 0 :(得分:4)
执行此操作时:
char * ptr = malloc(1);
您只为单个字节分配了足够的空间。然后,当您尝试对其进行strcat
或strcpy
任何操作时,您正在写的内容已超出分配的内存范围。这将调用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,"\"");