Дублируется массив в другой функции

Рейтинг: 0Ответов: 1Опубликовано: 15.01.2023

кодировал сообщение в Base64 (используя эту библиотеку https://github.com/Densaugeo/base64_arduino) в одной функции, а в другой получал и декодировал, но потом заметил, что при получении - локальный массив ret_b функции b частично дублирует массив ret функции a. Использую ESP8266. Что не так в коде, долго копаюсь - так и не понял.. Вот пример:

#include "base64.hpp"


void a() {
  unsigned char arr[300];
  unsigned char ret[180];
  arr[0] = 0x00;
  arr[1] = 0x00; 
  arr[2] = 0x07;
  arr[3] = 0x00; 
  arr[4] = 0x00;
  arr[5] = 0x00;
  arr[6] = 0x00;
  arr[7] = 0x00;
  arr[8] = 0x00;
  arr[9] = 0x00;
  arr[10] = 0x00;
  arr[11] = 0x00;
  arr[12] = 0x00;
  arr[13] = 0x00;
  arr[14] = 0x08; 
  arr[15] = 0x00; 
  arr[16] = 0x07; 
  arr[17] = 0x00; 
  arr[18] = 0x00;
  arr[19] = 0x04; 
  arr[20] = 0x00; 
  
  unsigned int base64_length = encode_base64(arr, 21, ret);
  Serial.println((char *)ret);
  Serial.println(ret[0], HEX);
  Serial.println(ret[1], HEX);
}

void b() {
  unsigned char ret_b[180];
  Serial.println((char *)ret_b);
  Serial.println(ret_b[0], HEX);
  Serial.println(ret_b[1], HEX);
}

void setup() {
  Serial.begin(9600);
  a();
  Serial.println();
  b();
}

void loop() {
  // put your main code here, to run repeatedly:

}

Вывод:

AAAHAAAAAAAAAAAAAAAIAAcAAAQA
41
41

AAAAAAAAAAAAAAAIAAcAAAQA
41
41

Ответы

▲ 3Принят

При завершении функции a память освобождается, но не стирается. Компилятор выделяет освободившиюся память в том же месте с поправкой на выравнивание. Поменяй немного код и там окажется другой кусок памяти. Поэтому переменные и массивы нужно всегда инициализировать или перезаписывать перед чтением. Кроме случая strtok.

Почистить массив можно функцией memset или просто писать новые данные поверх. А вы читаете его не записав ничего.