Сейчас на форуме: jinoweb, bartolomeo, rmn (+5 невидимых) |
eXeL@B —› Программирование —› Указатели |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 19 марта 2017 01:22 · Личное сообщение · #1 Привет! Пытаюсь разобраться с темой указателей в с, никак не могу найти ответ на один вопрос. В общем, есть примерно такой код: DWORD64 addr = 12345...; LPCSTR str; addr - это переменная в которой лежит некий адрес. Вопрос - как присвоить этот адрес str? Иными словами, как сделать так, чтобы указатель str, ссылался на адрес который лежит в addr? Также известно что по адресу 12345... находятся символьные данные. |
|
Создано: 19 марта 2017 02:20 · Поправил: v00doo · Личное сообщение · #2 В C и C++ строгая типизация, как минимум DWORD64 это 8 байт в памяти и это число, а LPCSTR это указатель на строку заканчивающуюся нулем, то есть это по сути указатель на массив байт. DWORD64 number = 12345; DWORD64 *ptr = &number; // ptr - и есть указатель. Но если принудительно, то скастуй: LPCSTR ptr = (LPCSTR )number; да, поправка, если number это уже некий адрес сампо себе то как выше, если надо НА это значение указатель, то как написал -=AkaBOSS=-. |
|
Создано: 19 марта 2017 02:21 · Личное сообщение · #3 |
|
Создано: 19 марта 2017 02:35 · Поправил: -=AkaBOSS=- · Личное сообщение · #4 Rew пишет: Вопрос - как присвоить этот адрес str спроси гугл про приведение типов или ptr = (LPCSTR) &number; v00doo пишет: LPCSTR ptr = (LPCSTR )number; по ссылке надо присваивать, иначе при обращении к указателю будет значение как адрес юзать а хотя да, правильно. не дочитал условие задачи. Если нужно число интерпретировать как адрес данных в памяти, тогда вариант v00doo - правильный. |
|
Создано: 19 марта 2017 02:49 · Поправил: dosprog · Личное сообщение · #5 |
|
Создано: 19 марта 2017 17:39 · Личное сообщение · #6 |
|
Создано: 19 марта 2017 18:18 · Личное сообщение · #7 |
|
Создано: 20 марта 2017 00:52 · Личное сообщение · #8 |
|
Создано: 20 марта 2017 01:41 · Поправил: dosprog · Личное сообщение · #9 |
|
Создано: 20 марта 2017 06:08 · Личное сообщение · #10 Большие исследования "защиты указателей в си" провели Самый первый верный ответ v00doo не проигнорировал разве что Jupiter v00doo пишет: DWORD64 number = 12345; DWORD64 *ptr = &number; // ptr - и есть указатель. Но если принудительно, то скастуй: LPCSTR ptr = (LPCSTR )number; Правда, лишних слов много. Исходя из вопроса: Rew пишет: addr - это переменная в которой лежит некий адрес. Вопрос - как присвоить этот адрес str? Правильным ответом будет именно LPCSTR ptr = (LPCSTR )number; Rew А что же будет, когда доберётесь до указателей на указатели, массивов указателей, и указателей на массивы указателей? )) ----- IZ.RU | Сообщение посчитали полезным: plutos |
|
Создано: 20 марта 2017 06:49 · Личное сообщение · #11 DenCoder пишет: А что же будет, когда доберётесь до указателей на указатели, массивов указателей, и указателей на массивы указателей? )) а указатели на функции, принимающие в качестве параметров указатели на массивы указателей на указатели? Страшно подумать! ----- Give me a HANDLE and I will move the Earth. | Сообщение посчитали полезным: DenCoder, Gideon Vi |
|
Создано: 20 марта 2017 12:44 · Поправил: dosprog · Личное сообщение · #12 |
|
Создано: 20 марта 2017 13:58 · Личное сообщение · #13 |
|
Создано: 23 марта 2017 03:04 · Личное сообщение · #14 C охуенен Столько возможностей выстрелить себе в ногу! как так, легитимно же, ёба?! Средний студент через такое рискует до указателей не дойти. | Сообщение посчитали полезным: plutos |
|
Создано: 23 марта 2017 03:23 · Личное сообщение · #15 Для тех, кто хочет по-настоящему разобраться с темой указателей, могу порекомендовать очень толковую книгу: "POINTERS ON C", by Kenneth A. Reek. Никакой "воды", 600 страниц и все по теме. Масса примеров отличного кода. Уверен, что ее легко найти на интернете. ----- Give me a HANDLE and I will move the Earth. | Сообщение посчитали полезным: Gideon Vi, Rew |
|
Создано: 23 марта 2017 09:34 · Поправил: dosprog · Личное сообщение · #16 Gideon Vi пишет: C охуенен ) Более чем. Gideon Vi пишет: как так, легитимно же, ёба?! ) Да, эта фича функции printf() доставляет траблы. В каком-то дремучем году даже пришлось делать функцию hexdump(), которая не помогла. Впрочем, если уметь пользоваться, то это даже удобно. Спецификаторы "%" влияют только на способ интерпретации данных в стеке, при выводе, динамически. Сам же порядок формирования стека закладывается статически при компиляции, на основании типов данных в аргументах. Оно должно соответствовать, но зависит от внимательности Добавлено спустя 31 минуту plutos пишет: Уверен, что ее легко найти на интернете. ) А вот я не уверен. Сходу нашлась оная только - Впечатление плохое - там одни крюки, читать невозможно --Добавлено-- А вот тут, вроде, Причём есть отсканированная версия (65Мб), и оцифрованная (4Мб). |
|
Создано: 23 марта 2017 10:20 · Поправил: Artem_N · Личное сообщение · #17 |
|
Создано: 23 марта 2017 12:35 · Личное сообщение · #18 |
|
Создано: 23 марта 2017 12:43 · Поправил: dosprog · Личное сообщение · #19 |
|
Создано: 04 апреля 2017 18:26 · Поправил: Rew · Личное сообщение · #20 Тааак... Я сейчас перечитал ответы и понял что я наверное не совсем внятно сформулировал вопрос. Решил накидать схему, чтобы стало понятнее, возможно у кого-то возникнет подобный вопрос: В общем мне нужно было как-то добраться до строковых данных и единственное решение которое я нашел: Code:
Интересно можно ли это сделать по другому(на чистом си)? |
|
Создано: 04 апреля 2017 18:43 · Поправил: reversecode · Личное сообщение · #21 |
|
Создано: 04 апреля 2017 18:45 · Поправил: rmn · Личное сообщение · #22 |
|
Создано: 04 апреля 2017 18:45 · Поправил: -=AkaBOSS=- · Личное сообщение · #23 |
|
Создано: 04 апреля 2017 18:48 · Личное сообщение · #24 Code:
в данном случае логично было бы p_buf объявить как LPCSTR* Code:
----- старый пень |
|
Создано: 23 августа 2017 05:21 · Личное сообщение · #25 Всем здравствуйте. Подскажите пожалуйста, где я ошибся |
|
Создано: 23 августа 2017 05:40 · Поправил: dosprog · Личное сообщение · #26 |
|
Создано: 23 августа 2017 06:18 · Личное сообщение · #27 Если бы вы поставили breakpoint на то место, где Exception is thrown, то легко бы увидели, что VstEvents2.events[0] указывает в никуда. Кроме того, сам тип 0xC0000005 Access Violation уже служит подсказкой. ----- Give me a HANDLE and I will move the Earth. | Сообщение посчитали полезным: sty, Gideon Vi |
|
Создано: 23 августа 2017 07:34 · Личное сообщение · #28 dosprog, plutos спасибо огромное! Ну вы, конечно, профи еще те - иначе и не скажешь! Прям, "камень с души" сняли. Как сказал мне один мой знакомый: а что ты хочешь, крэкеры-хакеры - они и есть крекеры-хакеры, если, конечно, настоящие, для них этот твой C/C++ - как пару семечек сощелкнуть. Не стал я с ним спорить на этот раз, потому как, что называется - ни прибавить, ни убавить. |
|
Создано: 26 августа 2017 01:10 · Личное сообщение · #29 Имхо ответ нужно искать не в языковых конструкциях. А если вам интересна не сишка, а какой то другой язык, в котором тоже есть указатели, то как его понять ? Путь должен быть следующим. Понять что есть указатель, тоесть спуститься до выхлопа компилятора, разобраться с результатом компиляции(асм). Тогда можно далее сопоставить выражение любого скрипта(компиля) с реально выполняемым кодом и таким образом понять его конструкции. А пытаться понять языковые абстракции используя для этого понятия конкретного языка это порочный круг. ----- vx | Сообщение посчитали полезным: sty |
|
Создано: 26 августа 2017 19:58 · Личное сообщение · #30 difexacaw, спасибо за совет, приму к сведению. Вообще, тема указателей - та еще штучка. Когда дело касается каких-то простых конструкций типа: int* pA = & A; - тут, конечно, ничего сложного нет. Когда же дело доходит до конструкций типа: char *(*(**foo[][8])())[]; или void (*signal(int, void (*fp)(int)))(int); - то тут, естественно, даже опытный программист может задуматься надолго. Поэтому, видимо, при каких-то сложных объявлениях - нужно учиться разбираться с помощью отладчика и знать побольше сообщений об ошибках, которые выдают компиляторы. В общем, век живи, век учись ... ну а дальше все знают. |
. 1 . 2 . >> |
eXeL@B —› Программирование —› Указатели |