строка для структурирования в C ++ - PullRequest
0 голосов
/ 04 июня 2018

У меня есть строковая переменная

string pr00("")

, и я хочу вызвать метод fun1

fun1(demo *dm)

, определенный следующим образом:

typedef struct 
{
    char pr00[100];
}demo;

это безопасно?называть этот метод как

fun1((demo*)pr00);

спасибо и BR

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Нет, это небезопасно.Поскольку члены std::string не совпадают с demo.

Но вы можете определить конструктор для неявного преобразования типа std::string в demo.

#define MAX_SIZE    100
struct demo 
{    
    demo(const std::string& str)
    {
       memset(pr00, 0, MAX_SIZE);

       if (str.length() < MAX_SIZE)
       {
           strncpy(pr00, str.c_str(), str.length());
           pr00[str.length()] = 0;
       }
    }

    char pr00[MAX_SIZE];
};

СейчасВы можете написать код так:

std::string name("hello world");
demo d(name);
0 голосов
/ 04 июня 2018

Я предполагаю, string означает std::string.

Это не просто небезопасно, но и недействительно.Вопрос имеет fun1((demo*)pr00).

Это попытка привести структуру к указателю.Неверно, и если у вашего компилятора есть настройки, где это разрешено, отключите их.

Есть немного более интересный вопрос относительно fun1((demo*)&pr00).Обратите внимание, что & принимает адрес pr00.

Это все еще неопределенное поведение, но по крайней мере это преобразование указателей между несвязанными структурами.

Вы можете определить void fun2(char*cp) и вызвать fun2((char*)&pr00)хотя то, что вы можете безопасно делать с cp внутри fun2(), имеет ряд ограничений.

Вы не должны делать никаких предположений относительно макета std::string, поэтому вы должны 'получить доступ к cp (иособенно не пиши в него) с любым предположением что ты можешь найти.

0 голосов
/ 04 июня 2018

Нет, fun1((demo*)pr00); - неопределенное поведение.Вам нужно будет скопировать (не более 100) символов из pr00 в demo и передать указатель на это fun1

demo dm;
std::copy_n(pr00.data(), std::min(100, pr00.size()), dm.pr00);
fun1(&dm);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...