Зачем printf с указателем формата указателя% p печатать символы мусора на AVR вместо адреса? - PullRequest
0 голосов
/ 15 февраля 2019

Я видел Как найти адрес переменной при использовании AVR? - и вывод там в основном:

printf () - отладка по встроенным целямнемного сложнее, вам нужно покопаться и выяснить, есть ли код для соединения printf () с последовательным портом и так далее.Кроме того, полный printf () может быть немного тяжелым, так что, возможно, вы уже используете урезанную стандартную библиотеку.Это не ответственность компилятора, вам нужно выяснить, как он реализован.

... но я не могу понять, почему возникла моя проблема.

У меня есть переменнаякоторый я хотел бы использовать как «массив строк» ​​и который я хотел бы использовать для malloc и realloc:

char** my_array = malloc(sizeof(char*)*1);

Затем я перенаправил printf для «печати» на последовательный порт USBпорт, а затем я читаю распечатки в последовательном терминале.

Насколько я знаю, спецификатор формата %p для printf должен печатать адрес переменной в виде шестнадцатеричного числа.И у меня есть такое утверждение:

printf("my_array %p\r\n", (void *)&my_array);

Я также пробовал:

printf("my_array %p\r\n", &my_array);
printf("my_array %p\r\n", my_array);

Во всех случаях полученная распечатка выглядит следующим образом:

my_array  ▒▒▒ꓣ▒▒▒▒/▒▒f'w'▒`$▒▒W*▒▒X▒f'w'▒`$▒▒Y*▒▒Z▒f'w'▒`▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒#▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒j▒{▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒i▒z▒▒`$▒▒

... что явно не шестнадцатеричное число.

Почему это происходит, и что я делаю неправильно?И как я могу получить адрес переменной, напечатанной в виде шестнадцатеричного числа в AVR?Если это имеет значение, я использую компилятор CodeVisionAVR ...


РЕДАКТИРОВАТЬ: нашел это:

https://www.avrfreaks.net/forum/format-specifier-pointers-0

Но люди на самом деле используют% pи особенно на AVR.На AVR указатель представляет собой 16-битное число без знака.Обычно я просто использовал бы% 04X или что-то другое.

(ОК, просто понял, что этот форум может означать 32-битную ARM или UC3, где, я думаю, указатели 32-битные? Даже если в этом случае% 08X)

... поэтому я просто использовал вместо этого:

printf("my_array %08X\r\n", (void *)&my_array);

... и теперь я получаю в качестве распечатки:

my_array 00003FFB

... но теперь у меня естьне знаю, фактический ли это адрес :)

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете привести указатель к uintptr_t и напечатать это:

printf("my_array %llu\r\n", (unsigned long long)(uintptr_t)&my_array);
...