В чем разница между char * ptr = "";char * ptr = NULL и char * ptr = malloc (1)? - PullRequest
0 голосов
/ 21 мая 2019

В настоящее время я работаю на платформе Arduino и пытаюсь избавиться от всех строк с помощью char [] и указателей, чтобы избежать проблем с памятью моего Arduino nano.Следующий код использовался для генерации строки и передачи функции, которая ожидает символ *:

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 Ответ

4 голосов
/ 21 мая 2019

Когда вы делаете это:

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,"\"");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...