Перейти к содержанию
    

Как в си объявить массив с возможностью изменения его размера?

.. в случае динамичесого массива, созданного через calloc/malloc это точно будет не так.

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

 

UPD:

Т.е. запись &abc просто нелогична, ну как получить адрес адреса.

Однако, компиляторописатели (хвала аллаху, что zltigo не из них) думают, что логична. Т.к. результат - всегда адрес. И глаз программера этот амперсанд так же примечает.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому как это совершенно разные вещи.
Но вот именно поэтому в C++ фокус с ссылкой на адрес статического элемента уже не прокатит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void *p;

}

Замените КАК ЭТО СДЕЛАНО В ПЕРВОИСТОЧНИКЕ:

 

u16 *p

 

И компилятор ответит, что он думает "Чему равен p"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Однако, компиляторописатели (хвала аллаху, что zltigo не из них) думают, что логична.
Это очень стремная радость. В один прекрасный момент решат, что это не "по фен-шую" и количество головной боли у тех, кто пользуется подобными недокументированными фичами будет весьма велико.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Замените КАК ЭТО СДЕЛАНО В ПЕРВОИСТОЧНИКЕ:

 

u16 *p

 

И компилятор ответит, что он думает "Чему равен p"

Адресу массива, не сомневайтесь.

Но согласитесь, на УЖАС, УЖАС, УЖАС это не тянет. Так, мелкое хулиганство :)

Причём меньшее, чем не посылка NAK в протоколе I2C.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это очень стремная радость. В один прекрасный момент решат, что это не "по фен-шую" и количество головной боли у тех, кто пользуется подобными недокументированными фичами будет весьма велико.

 

А самое главное зачем писать неправильную и более длинную конструкцию

 

char abc[10];
char *p = &abc;

 

вместо короткой и правильной

 

char abc[10];
char *p = abc;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Однако, компиляторописатели (хвала аллаху, что zltigo не из них) думают, что логична. Т.к. результат - всегда адрес. И глаз программера этот амперсанд так же примечает.

Хвала Аллаху, что у компиляторописателей голова растет не из ануса, посему на это:

u16 abc[10];
u16 *p;

main()
{
p = &abc;
...
}

компиляторрописатели IAR:

Error[Pe513]: a value of type "u16 (*)[10]" cannot be assigned to an entity of type "u16 *"

 

а это для разгообразия PowerCraft:

(139): operands of = have illegal types `pointer to u16' and `pointer to array 10 of u16t'

 

Реагируют посылкой в анус того, кто так пишет.

 

Адресу массива, не сомневайтесь.

Разуваем глаза и смотрим на вышенаписанное.

Но согласитесь, на УЖАС, УЖАС, УЖАС это не тянет. Так, мелкое хулиганство :)

Не соглашусь, однако.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хвала Аллаху, что у компиляторописателей голова растет не из ануса, посему на это:

...

Реагируют посылкой в анус того, кто так пишет.

Но всё-таки она вертится!?

Ведь результат &mass является адресом массива, хоть и с другими атрибутами, чем первый его элемент. Чтобы не париться, его всегда можно присвоить нетипизированному указателю. И это работает не только с массивами, но и с записами, юнионами, функциями и возможно ещё что упустил.

Очень интересная новость после стольких лет...

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В данном случае массив объявляется внутри функции. Мне нужно чтобы массив был глобальным, он потом используется в другой функции.

Если нужен глобальный, то объявляйте максимально возможного размера и не парьтесь. Это будет самый простой и надёжный вариант. Он гарантирует, что памяти хватит на самый большой шрифт, и при этом не использует динамического распределения памяти.

Ведь вам в любом случае нужно иметь память под самый большой шрифт, пусть она сразу и будет выделена.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вместо короткой и правильной

Более длинная и что важно, тоже правильная конструкция:

char *p = &abc[0];

может быть применена для подчеркивания того факта, что abc это массив. Иногда такое бывает удобно при быстром чтении.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если нужен глобальный, то объявляйте максимально возможного размера и не парьтесь. Это будет самый простой и надёжный вариант. Он гарантирует, что памяти хватит на самый большой шрифт, и при этом не использует динамического распределения памяти.

Ведь вам в любом случае нужно иметь память под самый большой шрифт, пусть она сразу и будет выделена.

 

Ну ну. Сегодня шрифт такой, завтра шеф (заказчик) запросит другой. Ну хоть проверку на размерность массива вставьте!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но всё-таки она вертится!?

Ведь результат &mass является адресом массива, хоть и с другими атрибутами, чем первый его элемент.

Что значит "вертится" и "является адресом", если компиляторы ВЫВАЛИВАЕТСЯ с ошибкой и соответственно НЕ генерят никакого кода?

Кто здесь пытается вертеться, как уж на сковородке, видно невооруженным взглядом :(.

И это работает не только...

Это не работает. Как там было у Задорнова - "Пива нет. СОВСЕМ нет!" - СОВСЕМ не раболтает. О чем я сразу и написал увидя этo:

uint16_t Buffer[50];
uint16_t *ptr_buffer;
.....
ptr_buffer = &Buffer;

Именно ЭТО увидел и именно об ЭТОМ а не чем-то другом написал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Указатель лежит в памяти. Адрес указателя - это адрес этой памяти.

:-))) Цитата из Вашей ссылки

 

Очевидно существует очень тесное соответствие между ин-

дексацией и арифметикой указателей. в действительности ком-

пилятор преобразует ссылку на массив в указатель на начало

массива. В результате этого имя массива является указатель-

ным выражением. Отсюда вытекает несколько весьма полезных

следствий. Так как имя массива является синонимом местополо-

жения его нулевого элемента, то присваивание PA=&A[0] можно

записать как

 

PA = A

 

По моему Вы и zltigo сомневались и учебники читать отправляли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто здесь пытается вертеться, как уж на сковородке, видно невооруженным взглядом :(.

Это смотря какой вопрос. То, что было изначально у ТС я не утверждал, что компилируется (вообще). Но то, что амперсанд можно применять ко многим объектам, включая массивы, и результат будет предсказуем, то бишь равен адресу объекта - я ещё раз повторяю. Если я уж, то сижу спокойно, в центре сковородки :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По моему Вы и zltigo сомневались и учебники читать отправляли.

 

Вы это к чему? Там же ниже прямо написано

 

конструкции типа

A=PA или A++,или P=&A будут незаконными.

 

Чего вы мне хотели сказать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...