Получение распределения памяти C ++, указывая на то же место, которое сбивает программуC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Получение распределения памяти C ++, указывая на то же место, которое сбивает программу

Сообщение Anonymous »

Я программирую чип RP2040 с помощью библиотеки Pico-Aduino. В этой проблеме я использую класс Ardunio String и класс Adafruit_neopixel. После настройки некоторых «строк» ​​и неопиксельного объекта, когда я затем делаю какое -либо манипулирование этими строками, когда они перераспределяют память, перераспределение заканчивается в одном или перекрывающемся месте выплаты неопикселя на указатель Pixel. Neopixel.pixel, я получаю следующие адреса (в шестнадцатеричной): < /p>

Код: Выделить всё

Location for str1: 200026f8
Location for str2: 20002708
Location for Pixel: 200027a0
Далее я вызову str1.reserve (50); , а затем снова распечатать местоположения:

Код: Выделить всё

Location for str1: 200027a0
Location for str2: 20002708
Location for Pixel: 200027a0
Когда функция Reserve вызывает на str1 , она перераспределяет свою память, которая затем заканчивается в том же месте, что и Pixel.
Я не понимаю, почему это происходит. Вот код, чтобы воспроизвести проблему (main.cpp): < /p>

Код: Выделить всё

#include "Arduino.h"
#include 

Adafruit_NeoPixel pixel;
String str1("");
String str2("");

void setup() {
// - setup Serial here
Serial.begin(115200); // USB serial
delay(1200); // provide time for serial to connect

pixel = Adafruit_NeoPixel(1, 25, NEO_GRB + NEO_KHZ800);
// print locations
Serial.println("Location for str1: " + String((uint32_t)str1.c_str(), HEX));
Serial.println("Location for str2: " + String((uint32_t)str2.c_str(), HEX));
Serial.println("Location for Pixel: " + String((uint32_t)pixel.pixels, HEX));

// now realloc string memory
str1.reserve(50); // this will overwrite the location of the pixels
Serial.println("Location for str1: " + String((uint32_t)str1.c_str(), HEX));
Serial.println("Location for str2: " + String((uint32_t)str2.c_str(), HEX));
Serial.println("Location for Pixel: " + String((uint32_t)pixel.pixels, HEX));
}

void loop() {
}
Я не могу найти ничего плохого ни в одной из библиотеки, и в любом случае я не понимаю, как Realloc может выделить память в том же месте, что и для другой переменной.>

Подробнее здесь: https://stackoverflow.com/questions/795 ... the-progra
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»