typedef volatile struct {
uint8_t adr_eep;
char list[20];
}List_EEpt;
List_EEpt list_eep[20];
void list_sort(void)
{
char* buf_eep[20]={0}; // буфер 20 элементов buf_eep - адрес буфера
for (uint8_t i=0;i<20;i++)
{
list_eep[i].adr_eep=0;
list_eep[i].list[0]='\0';
for (uint8_t t=0;t<20;t++)
{
*(buf_eep+t)='A'; //READ_EE(t*i+1); // заполняем буфер
}
list_eep[i].adr_eep=i*20;
strcpy(list_eep[i].list,*buf_eep);
}
}
Скажите пожалуйста , почему указатель увеличивается на 4 , а не на 1… Я же использую указатель на char который равен байту ,сумирую с uint8_t , который тоже байт… то есть buf_eep+1 должен увеличить адрес на 1 , в реальности увеличение идет на 4…
Спасибо
BOOM
01.Март.2025 14:23:25
2
А где выделение памяти для созданного указателя?
BOOM
01.Март.2025 14:28:41
3
А так что?
typedef volatile struct {
uint8_t adr_eep;
char list[20];
}List_EEpt;
List_EEpt list_eep[20];
void list_sort(void) {
char buf_eep_[20] = {0};
char* buf_eep = &buf_eep_[0]; // буфер 20 элементов buf_eep - адрес буфера
for (uint8_t i=0;i<20;i++) {
list_eep[i].adr_eep=0;
list_eep[i].list[0]='\0';
for (uint8_t t=0;t<20;t++) {
*(buf_eep+t)='A'; //READ_EE(t*i+1); // заполняем буфер
}
list_eep[i].adr_eep=i*20;
strcpy(list_eep[i].list,*buf_eep);
}
}
Из чего сделан такой вывод? Печати значения указателя в коде нет.
Потому, что это не буфер 20 элементов, а 20 указателей. Размер указателя 4 байта
3 лайка
BOOM
01.Март.2025 14:48:03
6
Гложат смутные сомнения, не два ли байта в ардуино указатель (фантомное откуда-то)?
Но компилятор же не будет врать?
1 лайк
Пошаговое исполнение в дебагере показывает увеличение адреса на 4 … да и дамп памяти ниже подтверждает
Если при обьявлении типа его проинициализировать, по идее память выделится автоматически? Разве нет ?
Дамп неизвесно на каком этапе появился.
А дебагер как зовут?
можно поподробнее … почему 20 указателей…а не указатель на 20 чаров ?
это STM32 дебагер встроенный
Указатель на 20 чаров - имя массива чар массива размерностью в 20 элементов.
Отлично. Игра “ответьте немедля почему в <random> архитектуре все работает не так, как я хочу”.
1 лайк
BOOM:
А так что?
Так работает… как написали я действительно создал просто 20 указателей…
Ну я так и решил использовав char* buf_eep[20] что он создаст массив и поместит указатель в buf_eep, а получилось , что сперва надо создать масcив ,а потом извлечь в другую переменную его адрес с помощью &
извините , не указал тип контроллера , решив, что данный вопрос относится к знанию языка , и данная ошибка будет на любой архитектуре… разве что прирост будет от разрядности отличаться
v258
01.Март.2025 15:13:19
18
char buf_eep[20]
Вот так и создаст, и поместит указатель в buf_eep
3 лайка
Вы же сами так объявили char * buf[20]
Буфер это char buf[20]
1 лайк
а…
т.е
char buf_eep[20];
*(buf_eep+1 ) -тоже получу второй элемент массива buf_eep ?