|
|
  |
Как в си объявить массив с возможностью изменения его размера? |
|
|
|
Jul 8 2011, 18:21
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (ar__systems @ Jul 8 2011, 21:02)  Строго говоря вы не правы. Выражение &Buffer имеет вполне определенный смысл. Значение его такое же как и &Buffer[0], но тип другой. Мне уже точно надоело  . Похоже Вы читать не умеете  . Именно о ТИПЕ - "Что указатель на int не является кирпичом" я, подчеркиваю я, а не вертящийся на сковородке GetSmart речь все время и вел и веду. Не приписываете мне то чего я не говорил. Выражение присваивающее указателю на int указатель на массив БЕССМЫСЛЕННО из-за разных типов. Любой вменяемый компилятор НЕ должен такое тупо и молча переваривать. Выражения присваивающие указателю на void указатель на массив void *ptr = &buffer, или указатель на первый элемент массива void *ptr = buffer являются СОВЕРШЕННО нормальными с точки зрения компилятора и я НИ РАЗУ ничего против не говорил. QUOTE (ar__systems @ Jul 8 2011, 21:15)  Ничего не вижу. ..... Чего и сколько там комприлятор разместил - хз  Глупейшая отмазка. На уровне страуса прячущего голову в песок  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 18:25
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(GetSmart @ Jul 8 2011, 11:32)  Я к тому и вёл, что ТС взял адрес массива вместо адреса нулевого элемента массива. Причём адреса оба равны. Только типом отличаются и только компилятор руганётся на это. Самое смешное, что для того чтобы в этом убедиться, не обязательно даже читать книжку. Достаточно потратить 5 минут на то, чтобы скомпилировать это выражение. g++ выдает вполне развернутое сообщение об ошибке, из которого ясно, что проблема в неправильном типе. Но гуру экспериментировать западло, это же значит надо в собственных непоколебимых знаниях усомниться. Цитата(zltigo @ Jul 8 2011, 14:21)  Мне уже точно надоело  . Похоже Вы читать не умеете  . Именно о ТИПЕ - "Что указатель на int не является кирпичом" я, подчеркиваю я, а не вертящийся на сковородке GetSmart речь все время и вел и веду. Не приписываете мне то чего я не говорил. Выражение присваивающее указателю на int указатель на массив БЕССМЫСЛЕННО из-за разных типов. Бессмысленно? Это на С, которому грубо говоря начихать на типы? Ну-ну. GetSmart все правильно написал, на сковордке это вы вертитесь, впадая в истерику от УЖАСНЫХ УЖАСНЫХ УЖАСНЫХ ошибок
|
|
|
|
|
Jul 8 2011, 18:32
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (ar__systems @ Jul 8 2011, 21:25)  Это на С, которому грубо говоря начихать на типы? Хорошо быть страусом и игнорировать очевидные вещи, типа наличия выделенной памяти под указатель и приведенные мной вопли сишного компилятора, которому таки не начихать на типы. Считайте, что в своей глупости Вы меня уже убедили. Достаточно, можете не продолжать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 18:38
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Я понял, откуда растет это волна негодования. Если исходить из того, что Buffer указывает на первый элемент массива, то &Buffer будет указывать вообще хз куда. т.е. это уже получится &(&Buffer[0]). Тут я соглашусь получается УЖАС - эта конструкция не имеет смысла. Но не надо забывать, что Buffer приравняли к &Buffer[0] исключительно для удобства пользователя языка, т.е. это сделано искуственно. А когда вы пишите &Buffer, компилятор не производит подстановку (Buffer > &Buffer[0]). Цитата Хорошо быть страусом и игнорировать очевидные вещи, типа наличия выделенной памяти под указатель и приведенные мной вопли сишного компилятора, которому таки не начихать на типы. Считайте, что в своей глупости Вы меня уже убедили. Достаточно, можете не продолжать. Да вы чушь пишите про выделение указателя. Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя.
|
|
|
|
|
Jul 8 2011, 18:49
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(ar__systems @ Jul 8 2011, 22:38)  Да вы чушь пишите про выделение указателя. Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя. Мужики! Хорош. Давайте ТС лучше поможем. char *realloc(ptr,size); Функция realloc изменяет размер ранее захваченного блока памяти. Аргумент ptr указывает на начало блока. Аргумент size за- дает новый размер блока в байтах. Содержимое блока не изменяется. Код unsigned char *alloc = NULL;
/* захватываем достаточное пространство для 8 байт */
alloc = (unsigned char*)malloc( 8 * sizeof(unsigned char) );
if ( NULL == alloc ){ /* Обработаем */ }
for ( int i= 0; i < 8; i++ ) alloc[i] = i;
/* перезахватывает блок, который содержащий 8 байт, добавляем еще 8 */ if (alloc != NULL) alloc = (unsigned char*)realloc( alloc,16 * sizeof(unsigned char));
if ( NULL == alloc ){ /* Обработаем */ }
for ( int i = 8; i < 16; i++ ) alloc[i] = i;
// Дальше САМИ
--------------------
Magic Friend
|
|
|
|
|
Jul 8 2011, 18:57
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (ar__systems @ Jul 8 2011, 21:38)  Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя. Страус увидел "лишнее слово" в памяти. Но то, что в этом слове лежит указатель (и даже компилятор назвал это слово именем массива, т.е. abc) страус видеть все еще не желает. Пусть оно будет "лишними словом" решил страус и успокоился. "лишнее слово" - и все опять в голове страуса становится просто и понятно - есть массив, если нужно из ниоткуда будет взят указатель на этот массив. Все остальное считать "нелепыми предположениями". Ну честно говоря, фиг с ним с этим страусом - это пока его проблемы. Имеющие разум да поймут. QUOTE (AHTOXA @ Jul 8 2011, 21:49)  А если сделать char abc[12]; ? Или для надёжности даже char abc[16]? Какая разница?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 19:09
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(zltigo @ Jul 8 2011, 22:06)  Ну в этом случае, надеюсь Вы действительно будете помалкивать, и думать, как я и просил. Потому, что: Код 50 char abc[10]; \ abc: \ 00000000 DS8 12 51 52 ulong test(void) 53 { 54 return( (ulong)abc ); \ test: \ 00000000 00009FE5 LDR R0,??test_0;; abc \ 00000004 0EF0A0E1 MOV PC,LR ;; return \ ??test_0: \ 00000008 ........ DC32 abc 55 } 32 бита памяти под указатель на abc[] видите? Или все еще будете думать, что это value берется ниоткуда? Вижу - только к выделению памяти для abc[] он не имеет никакого отношения. Как в анекдоте - а какой он апельсин ? Паровоз видел - видел, так вот совсем не похож. abc - это чисто адрес-константа, а в теле программы может быть еще 1000 ссылок на нее.
Сообщение отредактировал sasamy - Jul 8 2011, 19:29
|
|
|
|
|
Jul 8 2011, 20:19
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (sasamy @ Jul 8 2011, 22:09)  abc - это чисто адрес-константа, а в теле программы может быть еще 1000 ссылок на нее Именно так адрес-константа созданная компилятором для хранения указателя на массив abc[]. Соответственно будет использоваться компилятором, когда потребуется указатель на массив abc[]. QUOTE Тоесть вы утверждаете, что при определении массива char abc[10]; кроме 10 * sizeof(char) выделяется память для указателя abc ? Если да - потрудитесь привести пример, Потрудился показать, что для работы с массивом abc[] компилятор выделяет память для указателя abc. Если с массивом НЕ работать, память под указатель выделяться не будет, но и сам массив будет выкинут при оптимизации по причине его нахренненужности. QUOTE ( @ Jul 8 2011, 22:09) Вижу - только Вижу еще одного страуса. Интересно, а где еще GetSmart  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 20:27
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(sasamy @ Jul 8 2011, 18:41)  ууу... тут наверно книжки не помогут - не нужно изобретать своих определений, все уже определено без вас, в том числе термин "константа" Код In computer programming, a constant is an identifier whose associated value cannot typically be altered by the program during its execution (though in some cases this can be circumvented, e.g. using self-modifying code). Хотя написал некорректно, смысл в том что имя массива это константа и под нее вообще не выделяется память, память выделяется для массива - никакого адреса поэтому не получить. Ну и где там написано, что адрес констаты нельзя получить? Там написано только то, что значение, связанное с идентификатором константы, обычно нельзя изменить. В фортране так и без никаких «circumvent»-ов, просто по неосторожности. Если речь идёт о С, то изобретательность проявили Вы -- в стандарте С «константами» называются только числа, идентификаторы enum и символьные литералы. Имя массива в нём константой не называется. Даже строковые литералы не называются «константами». А у «константного объекта» адрес может и браться, в зависимости от. Но я не об этом, не о «взятии адреса константы». Несмотря на Вашу уверенность как в том, что abc есть константа, так и в том, что адрес константы получить нельзя Цитата(sasamy @ Jul 8 2011, 15:01)  Вам бы самому хоть немного почитать. abc -- это указатель-константа которая равна адресу первого элемента массива с нулевым индексом, у константы не может быть адреса. &abc вполне себе возвращает адрес, только не константы, а массива. Не первого элемента массива, а всего массива. По одной причине -- имя массива не есть «константный указатель». Имя массива -- выражение, означающее «массив элементов такого-то типа». К выражению «указатель на объект такого-то типа» со значением адреса первого элемента массива оно только автоматически приводится, но не всегда. Одно из мест -- как раз обсуждаемый унарный &. Другое -- sizeof(abc), который возвращает размер не «указателя-константы которая равна адресу первого элемента массива с нулевым индексом», а массива. И строковый литерал "foo" в контексте инициализации символьного массива ведёт себя не как «константный указатель на первый элемент» строки (неявного массива символов). И, кстати, &"foo" допустимо на тех же правах, что и &abc. Так что почитайте книги, если считаете что Вам, в отличие от меня, они ещё помогут. ____________________________ -- Множество чего? -- Просто множество.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 8 2011, 21:10
|
Местный
  
Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821

|
Цитата(011119xx @ Jul 8 2011, 20:06)  Keil не ругается на выражение Код ptr_buffer = &Buffer; Кроме того, выражение Код ptr_buffer = &Buffer[0]; его тоже устраивает. Настолько, что он воспринимает их как одинаковыми. Уважаемый, не тупите, и почитайте(внимательно) всё написанное выше, ведь из за Вас всё это бодание началось.
|
|
|
|
|
Jul 8 2011, 22:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(AHTOXA @ Jul 8 2011, 21:31)  Если нужен глобальный, то объявляйте максимально возможного размера и не парьтесь. Это будет самый простой и надёжный вариант. Он гарантирует, что памяти хватит на самый большой шрифт, и при этом не использует динамического распределения памяти. Ведь вам в любом случае нужно иметь память под самый большой шрифт, пусть она сразу и будет выделена. Это именно что придирки. Речь шла не о проверке компилятором того, что программист правильно указал размер массива, а о проверке компилятором того, что под указанный программистом размер массива хватит памяти. Вот вам цитата из моего сообщения (к которому вы придрались изначально): Почитайте раз пять, для надёжности. И если вдруг возникнет желание ещё что-то написать, то подумайте ещё немного, и не делайте этого, хватит уже позориться, на старости-то лет  1. Если нужен глобальный, то объявляйте максимально возможного размера и не парьтесь. Максимально возможного размера это такого размера, который допускает компилятор+линкер, т.е. вся доступная свободная память. 2. Это будет самый простой и надёжный вариант. Ой ли. 3. Он гарантирует, что памяти хватит на самый большой шрифт, и при этом не использует динамического распределения памяти. Ничего этот максимальный размер не гарантирует. 4. Ведь вам в любом случае нужно иметь память под самый большой шрифт, пусть она сразу и будет выделена. Эта фраза входит в полное противоречие с пп.1-3. На самом деле, максимального возможного размера надо интерпретировать, как минимально необходимого для копирования максимально широкого символа максимального большого шрифта используемого в настоящий момент в программе. Учитесь, мой друг, свои мысли однозначно излагать, а не считать всех старыми козлами. Я ваш текст читаю, а не шарады разгадываю на тему, что вы там имели в виду.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|