Массив char через указатель

 
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…
Спасибо

А где выделение памяти для созданного указателя?

А так что?

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 лайка

Гложат смутные сомнения, не два ли байта в ардуино указатель (фантомное откуда-то)?

Но компилятор же не будет врать?

1 лайк

Пошаговое исполнение в дебагере показывает увеличение адреса на 4 … да и дамп памяти ниже подтверждает

Если при обьявлении типа его проинициализировать, по идее память выделится автоматически? Разве нет ?

Дамп неизвесно на каком этапе появился.
А дебагер как зовут?

можно поподробнее … почему 20 указателей…а не указатель на 20 чаров ?

это STM32 дебагер встроенный

Указатель на 20 чаров - имя массива чар массива размерностью в 20 элементов.

Отлично. Игра “ответьте немедля почему в <random> архитектуре все работает не так, как я хочу”.

1 лайк

:smile: :laughing: :sweat_smile:

1 лайк

Так работает… как написали я действительно создал просто 20 указателей…

Ну я так и решил использовав char* buf_eep[20] что он создаст массив и поместит указатель в buf_eep, а получилось , что сперва надо создать масcив ,а потом извлечь в другую переменную его адрес с помощью &

извините , не указал тип контроллера , решив, что данный вопрос относится к знанию языка , и данная ошибка будет на любой архитектуре… разве что прирост будет от разрядности отличаться

char buf_eep[20]

Вот так и создаст, и поместит указатель в buf_eep

3 лайка

Вы же сами так объявили char * buf[20]
Буфер это char buf[20]

1 лайк

а…
т.е
char buf_eep[20];
*(buf_eep+1 ) -тоже получу второй элемент массива buf_eep ?