Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
1

Приравнивание указателя одного типа к указателю другого

23.08.2019, 00:53. Показов 2364. Ответов 22
Метки нет (Все метки)

Есть структура :
C++
1
2
3
4
5
6
7
struct hci_inquiry_req {
    uint16_t dev_id;
    uint16_t flags;
    uint8_t  lap[3];
    uint8_t  length;
    uint8_t  num_rsp;
};
есть кусок кода :
C++
1
2
3
4
5
6
7
8
struct hci_inquiry_req *ir;
void *buf;
buf = malloc(sizeof(*ir) + (sizeof(inquiry_info) * (nrsp)));
ir = buf;
ir->dev_id  = dev_id;
ir->num_rsp = num_rsp;
ir->length  = len;
ir->flags   = flags;
что делает вообще ir = buf?

Добавлено через 16 минут
Это случаем не равносильно hci_inquiry * ir = new hci_inquiry [5]?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2019, 00:53
Ответы с готовыми решениями:

Преобразование указателя одного типа в указатель другого
Помоги пожалуйста составить программу: Преобразовать указатель одного типа в указатель другого.

Как присвоить указателю значение другого указателя внутри процедуры?
Подскажите пожалуйста. Вот я хочу одному указателю присвоить значение другого указателя внутри...

Forbids casting в dlsym - ISO C++ не поддерживает приведение типа указателя на функцию к указателю на объект
Есть вот такой пример загрузки .so #include <iostream> #include <dlfcn.h> int main() { ...

Приведение одного парметра-типа к другому разыменованному парметру-типу (указателю) в шаблонах
Здравствуйте! изучаю C++, и есть такой вопрос, можно ли при инстанцировании, допустим, шаблонной...

22
зомбяк
1532 / 1177 / 332
Регистрация: 14.05.2017
Сообщений: 3,822
23.08.2019, 01:02 2
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

По смыслу - да. И там далее будет free(buf);, не delete[] ir;.

Добавлено через 1 минуту
new hci_inquiry [nrsp]
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
23.08.2019, 01:06  [ТС] 3
TRam_, раньше вообще не лез в С и c malloc'oм дело не имел,он выделяет память в куче размером size * byte,окей,,к примеру мы имеем структуру
C++
1
2
3
struct str{
      int a;
};
и если сделать так
str * p = new str[1];
то насколько я понимаю выделится 4 байта памяти в куче,
а если я сделаю
str * p = (str * ) malloc (2);
что в даном случае?
или этот код бред? я не тестил
0
зомбяк
1532 / 1177 / 332
Регистрация: 14.05.2017
Сообщений: 3,822
23.08.2019, 01:10 4
Цитата Сообщение от ReYalp Посмотреть сообщение
что в данном случае?
при попытке прочитать или задать p->a будет обращение к не выделенной памяти, приложение может вылететь.
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
23.08.2019, 01:14  [ТС] 5
TRam_, а можно как-то через new выделить определенное кол-во байт?

Добавлено через 1 минуту
и если да,уместно ли вообще тогда использовать malloc в C++?
0
С чаем беда...
Эксперт CЭксперт С++
9137 / 4656 / 1267
Регистрация: 18.10.2014
Сообщений: 10,492
23.08.2019, 01:21 6
Цитата Сообщение от ReYalp Посмотреть сообщение
что делает вообще ir = buf?
Ничего не делает. Это просто ошибка в коде. Не компилируемо.
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
23.08.2019, 01:31  [ТС] 7
TheCalligrapher, каким компилятором компилировали?

Добавлено через 47 секунд
Если реально ошибка то странно, у меня все ок с этой строкой, удалю ка, так программа будет меньше места занимать и быстрее работать
0
С чаем беда...
Эксперт CЭксперт С++
9137 / 4656 / 1267
Регистрация: 18.10.2014
Сообщений: 10,492
23.08.2019, 01:43 8
Цитата Сообщение от ReYalp Посмотреть сообщение
TheCalligrapher, каким компилятором компилировали?
Абсолютно любым. В С++ запрещены неявные преобразования из void *.

http://coliru.stacked-crooked.... b819758c16
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
23.08.2019, 01:53  [ТС] 9
TheCalligrapher, почему так? Что может случится если я неявно преобразую из void *?
0
С чаем беда...
Эксперт CЭксперт С++
9137 / 4656 / 1267
Регистрация: 18.10.2014
Сообщений: 10,492
23.08.2019, 02:09 10
Цитата Сообщение от ReYalp Посмотреть сообщение
почему так?
Так устроен контроль соответствия типов в языке С++.

Цитата Сообщение от ReYalp Посмотреть сообщение
Что может случится если я неявно преобразую из void *?
Как это "что может случиться"? Очевидно же, что нет никакой гарантии того, что указатель void * на самом деле указывает на тот тип, к указателю на который вы его преобразуете.
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
23.08.2019, 02:20  [ТС] 11
TheCalligrapher, вот интересно насчёт не явного преобразования, в данном случае
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
class test{
  public:
test(int num) {
std::cout << this << std::endl;
} 
} ;
int main() {
 test q = 5;
 test * qp = &q;
 std::cout << qp;
return 0;
 
}
Разве test q =5;
Не аналогичен
test q = test copyofq(5);//псевдокод
Если да то почему адреса одинаковые?
0
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,208
23.08.2019, 02:22 12
Цитата Сообщение от ReYalp Посмотреть сообщение
Что может случится если я неявно преобразую из void *?
ничего такого ужасного,
чего не может случится и при явном приведении.

каст из void* не безопасен в принципе.
и запрет на неявный каст от возможных ошибок не убережет.

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

моё мнение: глупый запрет.

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Как это "что может случиться"? Очевидно же, что нет никакой гарантии того, что указатель void * на самом деле указывает на тот тип, к указателю на который вы его преобразуете.
ты это так пишешь, как будто бы запрет на неявный каст тебе что-то там гарантирует.
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
23.08.2019, 02:23  [ТС] 13
hoggy, а как вообще работает явный каст? Он как-то увеличивает размер типа переменной если это нужно? XD
0
С чаем беда...
Эксперт CЭксперт С++
9137 / 4656 / 1267
Регистрация: 18.10.2014
Сообщений: 10,492
23.08.2019, 02:38 14
Цитата Сообщение от ReYalp Посмотреть сообщение
Разве test q =5;
Не аналогичен
test q = test copyofq(5);//псевдокод
Во-первых, так было во времена динозавров. Во-вторых, даже во времена динозавров компиляторам C++ разрешалось не создавать copyofq.

В современном С++ создавать копию вообще запрещается. test q = 5; аналогичен test q(5);

Цитата Сообщение от ReYalp Посмотреть сообщение
Если да то почему адреса одинаковые?
Адреса чего именно одинаковые??? Ваш код просто два раза выводит адрес q.

Цитата Сообщение от ReYalp Посмотреть сообщение
а как вообще работает явный каст? Он как-то увеличивает размер типа переменной если это нужно?
Явный каст ничего не увеличивает. Явный каст просто позволяет вам явно сделать потенциально опасное преобразование указателя (которое без каста просто не скомпилируется).
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
23.08.2019, 02:41  [ТС] 15
TheCalligrapher,
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Адреса чего именно одинаковые??? Ваш код просто два раза выводит адрес q.
если бы
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
во времена динозавров
то там бы создалась копия с другим адресом,сейчас все понятно.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Явный каст ничего не увеличивает. Явный каст просто позволяет вам явно сделать потенциально опасное преобразование указателя (которое без каста просто не скомпилируется).
так смысл тогда в запрете не явного каста если явный каст просто делает то же самое что и не явный?
0
С чаем беда...
Эксперт CЭксперт С++
9137 / 4656 / 1267
Регистрация: 18.10.2014
Сообщений: 10,492
23.08.2019, 03:22 16
Цитата Сообщение от ReYalp Посмотреть сообщение
так смысл тогда в запрете не явного каста если явный каст просто делает то же самое что и не явный?
Только в том, чтобы заставить вас своей рукою открытым текстом написать: да, я хочу выполнить это опасное преобразование. (И, опционально, через использование C++-кастов, указать, какой именно класс преобразований вы хотели бы применить.)

Другими словами, при помощи явного каста вы говорите компилятору, что данное несоответствие типов не является случайной ошибкой или опечаткой.
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
23.08.2019, 08:03  [ТС] 17
TheCalligrapher, а есть ли сейчас смысл использовать explicit при написании конструктора если и так
Во-первых, так было во времена динозавров. Во-вторых, даже во времена динозавров компиляторам C++ разрешалось не создавать copyofq.

В современном С++ создавать копию вообще запрещается. test q = 5; аналогичен test q(5);
0
С чаем беда...
Эксперт CЭксперт С++
9137 / 4656 / 1267
Регистрация: 18.10.2014
Сообщений: 10,492
23.08.2019, 08:20 18
Цитата Сообщение от ReYalp Посмотреть сообщение
а есть ли сейчас смысл использовать explicit при написании конструктора если и так
test q = 5; "аналогичен" test q(5); с точки зрения выполняемых действий при условии, что обе эти конструкции являются корректными.

Но правила корректности этих конструкций не изменились. explicit по-прежнему работает так, как он работал и раньше. То есть полной эквивалентности между этими двумя вариантами нет.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
23.08.2019, 08:51  [ТС] 19
TheCalligrapher, explicit (насколько я знаю) запрещает же неявное преобразование,
вот как раз такой вариант он должен как бы запретить
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
test q = 5;
так как там как бы должна создаваться копия объекта ,но еслси она не создается то какой смысл его использовать? Неявного преобразования и так ввыходит что нету
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,270
Записей в блоге: 16
23.08.2019, 12:38 20
ReYalp, неявное преобразование к void* разрешено, а наоборот нет. Это потому, что через это преобразование становится доступно неявное преобразование чего угодно во что угодно. И программа неявно преобразуется в бардак...
C++
1
2
3
4
5
6
7
8
9
10
int a;
    void* pva = &a;//pva -липкий и может указывать на что угодно)
    //int* pi = pva; нельзя потому что в обратную строну - можно:
    int* pi = &a;
    //вот оно
    pva = pi;
    //но если разрешить например
    double* pd = pva;//не разрешено к счастью, потому что это равносильно разрешению:
    double* pd = pi;//а это был бы отказ от контроля типов - очень важной проверки времени компиляции
    //
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2019, 12:38

Перенос данных из переменной одного типа в переменную другого типа
Добрый день! Одна часть программы размещает полученные данные(символы) в ПЕРЕМ1 типа ustring ( или...

Как вызвать из одного класса (для метода типа void) метод типа boolean другого класса?
ребят, только учусь и конечно, вопросов возникает много. ситуация вот в чем. есть массив. я должна...

Ссылка одного типа на объекты другого
class Program { static void Main(string args) { A b = new B(); A c =...

Приравнивание/Сравнение переменных типа char
Вообщем, есть такой вопрос, мне нужно приравнять в условии одну переменную типа char к какому...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.