c++ - 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
提前致谢
解决方案
当你这样做时:
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,"\"");