@engune
Разработчик сайтов и мобильных приложений

Как получить доступ к элементов структуры по указателю (С++)?

Как можно получить доступ к элементам структуры?

Есть указатель на void * ( указывает на определенную структуру ). Пример:

struct object
{
int a;
std::string b;
};


у меня есть указатель -

object o;
void *p = &o;


можно узнать смещение в памяти по указателю:

int offset1 = offsetof(struct object, a);
int offset2 = offsetof(struct object, b);


например int я могу установить:

*((int *) (p + offset1)) = 5;

вопрос как установить std::string? если я привожу к указателю - получаю кашу. Вариант использовать в структуре указатель на std::string не подходит. Есть варианты?

---

Хотя проверил так работает:

#include <iostream>
#include <string>

struct object
{
    int a;
    std::string b;
};

int main(int argc, const char * argv[]) {
    
    object o;
    char *p = (char *) &o;
    
    o.a = 1;
    o.b = "demo";
    
    int offset1 = offsetof(struct object, a);
    int offset2 = offsetof(struct object, b);
    
    *((int *) (p + offset1)) = 5;
    *((std::string *) (p + offset2)) = std::string("demoooo");
    
    return 0;
}


я использовал wxString (wxwidgets) - видимо там свои проблемы.
  • Вопрос задан
  • 745 просмотров
Пригласить эксперта
Ответы на вопрос 3
@vilgeforce
Раздолбай и программист
object* oPtr = (object*)p;
oPtr->b = "foobar";
не вариант, ладно.

unsigned char* addr = (unsigned char*)o;
addr = addr + offset2;
std::string* strPtr = (std::string*)addr;
*strPtr = "foo";
Вариант два тоже не вариант?
Ответ написан
petermzg
@petermzg
Самый лучший программист
1. std::string - это класс, так что в структуре будет указатель на обьект класса.
2. Смещение внутри структуры у разных компиляторов может быть разным, это зависит от настройки по выравниванию данных.
3. Есть еще такой синтаксис
struct Object{
        bool m_fVisible			: 1;
	bool m_fEnable			: 1;
	bool m_fEntered			: 1;
	bool m_fTopmost			: 1;
	bool m_fSimple			: 1;
	bool m_fParentCursor	: 1;
	bool m_fClickEvent		: 1;
	bool m_fRedrawEnter		: 1;
	bool m_fWheelEvent		: 1;
}

Что в этом случае делать будете?
Ответ написан
sfi0zy
@sfi0zy
Creative frontend developer
Возможно я не совсем понял вопрос, но почему нельзя использовать
object o;
void *p = &o;
((struct object*)p)->b = "hello";
std::cout << ((struct object*)p)->b; // hello
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы