Как получить доступ к элементов структуры по указателю (С++)? Как можно получить доступ к элементам структуры?
Есть указатель на 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
#include
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) - видимо там свои проблемы.

21 Авг 2019 в 07:05
211 +1
0
Ответы
1

Да, вы правы. Использование стандартного std::string в данном случае может вызвать проблемы из-за своей сложной структуры данных. Если вы хотите сохранить строку в структуре по указателю, можно воспользоваться более простым способом, например, использовать массив символов:

#include <iostream>
struct object
{
int a;
char b[20]; // предполагаем максимальную длину строки
};
int main(int argc, const char * argv[]) {
object o;
char *p = (char *) &o;
o.a = 1;
int offset1 = offsetof(struct object, a);
int offset2 = offsetof(struct object, b);
*((int *) (p + offset1)) = 5;
strcpy((char *)(p + offset2), "demoooo");
return 0;
}

В этом примере в структуре object вместо std::string использован массив символов char b[20], чтобы хранить строку. При установке значения в этот массив можно воспользоваться функцией strcpy. В данном случае "demoooo" будет скопировано в массив символов.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 683 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир