Экзотический вопрос:
От: Аноним  
Дата: 20.08.03 22:20
Оценка:
Выделяю память таким образом:
char (*varray)[200] = (char (*)[200]) &new char[200];

Все вроде бы ок, но пытаясь удалить через delete вполучаю эксепшн. У кого какие догадки?
Re: Экзотический вопрос:
От: Андрей Тарасевич Беларусь  
Дата: 20.08.03 23:22
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Выделяю память таким образом:

А>
А>char (*varray)[200] = (char (*)[200]) &new char[200];
А>

А>Все вроде бы ок, но пытаясь удалить через delete вполучаю эксепшн. У кого какие догадки?

Что здесь делает оператор взятия адреса '&' ? Зачем ты его туда поместил и что по-твоему он там делает?

С точки зрения С++ это код некорректен. Результат new expression не является lvalue и, поэтому, оператор взятия адреса к нему неприменим. Компилятор должен выдавать сообщение об ошибке. Если твой компилятор не выдает такого сообщения, то остается только гадать, как же он понимает этот код (неудивительно, что все в конечном итоге рушится).

Если уж ты хочешь доступаться к выделенной памяти через такой указатель, то никакой оператор взятия адреса тут не нужен

char (*varray)[200] = (char (*)[200]) new char[200];
Best regards,
Андрей Тарасевич
Re[2]: Экзотический вопрос:
От: Vamp Россия  
Дата: 21.08.03 06:53
Оценка:
char (*varray)[200] = (char (*)[200]) new char[200];


А я что-то вообще не могу понять, какой тип имеет переменная varray?
Массив из двухсот указателей на char? Похоже, что нет — иначе такой хитрый синтаксис new не нужен.
Указатель на массив из двухсот char'ов? Тоже навряд, ибо тогда вообще непонятно, зачем он такой нужен.
Так какой тип?
Да здравствует мыло душистое и веревка пушистая.
Re: Экзотический вопрос:
От: LaptevVV Россия  
Дата: 21.08.03 06:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Выделяю память таким образом:

А>
А>char (*varray)[200] = (char (*)[200]) &new char[200];
А>

А>Все вроде бы ок, но пытаясь удалить через delete вполучаю эксепшн. У кого какие догадки?
Как я понимаю — это указатель на 200 char.
Это можно объявить просто:

char *varray = new char[200];
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Экзотический вопрос:
От: Владик Россия  
Дата: 21.08.03 07:07
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Указатель на массив из двухсот char'ов?


Именно так.

V>Тоже навряд, ибо тогда вообще непонятно, зачем он такой нужен.

V>Так какой тип?

Например, чтобы передать его в функцию, у которой в качестве параметра массив из 200 char'ов. Хотя особенно интересно такое приведение типа в случае многомерных массивов. new не умеет создавать многомерных массивов, но используя такое явное приведение можно избавиться от необходимости "ручного" пересчета индексов многомерного массива на индекс полученного через new одномерного массива.

P.S. Кстати, корректно удалять "такой" массив надо через: delete (char *)varray;
Как все запущенно...
Re[3]: Экзотический вопрос:
От: Павел Кузнецов  
Дата: 21.08.03 07:08
Оценка: 5 (1)
Здравствуйте, Vamp, Вы писали:

V>
V> char (*varray)[200] = (char (*)[200]) new char[200];
V>


V> А я что-то вообще не могу понять, какой тип имеет переменная varray? <...>

V> Указатель на массив из двухсот char'ов?

Именно.

V> Тоже навряд, ибо тогда вообще непонятно, зачем он такой нужен.


Отчего же?.. Например, представь себе ситуацию, когда у тебя есть 20 подобных массивов
и по какому-то условию надо проинициализировать подобный указатель одним из них, и дальше
по коду (возможно, до какого-то другого момента) работать именно с этим "избранным" массивом.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Экзотический вопрос:
От: Lorenzo_LAMAS  
Дата: 21.08.03 07:08
Оценка:
Дополнительные скобки приводят к тому, что это объявляется указатель на массив из 200 char
Of course, the code must be complete enough to compile and link.
Re[4]: Экзотический вопрос:
От: Lorenzo_LAMAS  
Дата: 21.08.03 07:11
Оценка: +1
char'ов. Хотя особенно интересно такое приведение типа в случае многомерных массивов. new не умеет создавать многомерных массивов, но используя такое явное приведение можно

Неверное утверждение.

char (*ar)[10][20] = new char[100][10][20];

delete [] ar;
Of course, the code must be complete enough to compile and link.
Re[4]: Экзотический вопрос:
От: Vamp Россия  
Дата: 21.08.03 07:18
Оценка:
V>> А я что-то вообще не могу понять, какой тип имеет переменная varray? <...>
V>> Указатель на массив из двухсот char'ов?
ПК>Именно.
ПК>Например, представь себе ситуацию, когда у тебя есть 20 подобных массивов
ПК>и по какому-то условию надо проинициализировать подобный указатель одним из них, и дальше

А чем не устроит просто
char **varray?
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Экзотический вопрос:
От: Lorenzo_LAMAS  
Дата: 21.08.03 07:19
Оценка:
А тем, что это другой тип
Of course, the code must be complete enough to compile and link.
Re[6]: Экзотический вопрос:
От: Vamp Россия  
Дата: 21.08.03 07:41
Оценка:
Естественно, я имел в виду просто
char *v

код

   char ch1[128], ch2[100], ch3[50];

   char *parr;

   parr=ch1;

отлично компилируется и работает без ошибок.
Да здравствует мыло душистое и веревка пушистая.
Re[7]: Экзотический вопрос:
От: Кодт Россия  
Дата: 21.08.03 08:12
Оценка:
Здравствуйте, Vamp, Вы писали:

V>
V>   char ch1[128], ch2[100], ch3[50];

V>   char *parr;

V>   parr=ch1;
V>

V>отлично компилируется и работает без ошибок.

С другой стороны,
typedef char dozen_t[12]; // чтобы ниже не разводить LISP (*)

dozen_t theFirstDozen, theSecondDozen;


void fill_dozen(dozen_t* pDozen); // передаем по ссылке (по указателю).

...
char something[3];
fill_dozen(&something); // ошибка.
...

(*) LISP шутливо расшифровывается как Lots of Incredibly Stupid Parenthesis (куча идиотских скобок)
Перекуём баги на фичи!
Re[8]: Экзотический вопрос:
От: Vamp Россия  
Дата: 21.08.03 08:19
Оценка:
То есть, если я правильно понял, смысл — в контроле на этапе компиляции? Что бы не передавать неизветно что туда, где годятся именно 200-символные массивы чар?
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Экзотический вопрос:
От: Андрей Тарасевич Беларусь  
Дата: 21.08.03 09:04
Оценка: +1
Здравствуйте, Владик, Вы писали:

В>P.S. Кстати, корректно удалять "такой" массив надо через: delete (char *)varray;


Тогда уже 'delete[] (char*) array'.
Best regards,
Андрей Тарасевич
Re[5]: Экзотический вопрос:
От: Владик Россия  
Дата: 21.08.03 10:00
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

В>>P.S. Кстати, корректно удалять "такой" массив надо через: delete (char *)varray;

АТ>Тогда уже 'delete[] (char*) array'.

Да, упорное писание на джаве даром не прошло С многомерным new лажанулся (помнится кто-то когда-то меня уже поправлял) и с delete тоже
Как все запущенно...
Re: Экзотический вопрос:
От: saskin http://rsdn.ru/
Дата: 21.08.03 10:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Выделяю память таким образом:

А>
А>char (*varray)[200] = (char (*)[200]) &new char[200];
А>

А>Все вроде бы ок, но пытаясь удалить через delete вполучаю эксепшн. У кого какие догадки?

delete[] varray;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.