2015-03-19 5 views
0

Я думал, что для инициализации struct на C++ все, что вы сделали, это имя struct и переменная. Тем не менее, я получаю предупреждение, не инициализированное в этой функции предупреждения.Не удалось инициализировать структуру в C++

Как инициализировать LPCPINFO cpinfo struct?

#include <iostream> 
#include <string.h> 
#include <sstream> 
using namespace std; 

const int MAX_DEFAULTCHAR = 2; 

const int MAX_LEADBYTES = 12; 

typedef struct _cpinfo { 
    unsigned int MaxCharSize; 
    char DefaultChar[MAX_DEFAULTCHAR]; 
    char LeadByte[MAX_LEADBYTES]; 
} CPINFO, *LPCPINFO; 


int main() { 

    LPCPINFO cpinfo; 
    cpinfo->DefaultChar[0]= 1; 
    cpinfo->DefaultChar[1]= 0; 
    cpinfo->LeadByte[0] = cpinfo->LeadByte[1] = 0; 
    cpinfo->MaxCharSize = 4; 

    cout << cpinfo->DefaultChar[0] << " " << cpinfo->DefaultChar[1] << " " 
     << cpinfo->LeadByte[0] << " " <<cpinfo->LeadByte[1] << " " 
     << cpinfo->MaxCharSize 
     << endl; 

    return 0; 
} 
+3

Да, вы используете только название структуры, но 'LPCPINFO' не так. – chris

+0

Так что же LPCINFO? – Aaron

+4

Кроме того, 'typedef struct' не требуется в программе на C++. Возможно, если бы вы определили ваши структуры на C++, у вас было бы меньше проблем с кодом. – PaulMcKenzie

ответ

3

LPCPINFO определяется как указатель на CPINFO структуры (обратите внимание на * в typedef). Вам нужно выделить память:

LPCPINFO cpinfo = new CPINFO(); 

Или вы можете просто использовать CPINFO-структуру:

CPINFO cpinfo; 
cpinfo.DefaultChar[0] = 1; 
//... 
+1

Что касается варианта 1 - Слишком много новых кодеров попадают в ловушку ненужного выделения памяти, когда все, что им нужно сделать, это объявить экземпляр. – PaulMcKenzie

+0

Здесь знание того, где заканчивается вещь, полезно - в стеке или на куче. Это также требует знания этих двух вещей :) – Steve

1

Инициализация переменной структуры будет выглядеть следующим образом:

_cpinfo MyScructVar; 

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

1

Поскольку вы помечено этот вопрос, как C++, это сделало бы его намного понятнее, если вы определили свой struct ++ путь C:

struct _cpinfo { 
    unsigned int MaxCharSize; 
    char DefaultChar[MAX_DEFAULTCHAR]; 
    char LeadByte[MAX_LEADBYTES]; 
}; 

Тогда main становится этим:

int main() 
{ 
    _cpinfo cpinfo; 
    cpinfo.DefaultChar[0]= 1; 
    cpinfo.DefaultChar[1]= 0; 
    cpinfo.LeadByte[0] = cpinfo.LeadByte[1] = 0; 
    cpinfo.MaxCharSize = 4; 

    cout << cpinfo.DefaultChar[0] << " " << cpinfo.DefaultChar[1] << " " 
    << cpinfo.LeadByte[0] << " " <<cpinfo.LeadByte[1] << " " 
    << cpinfo.MaxCharSize 
    << endl; 

    return 0; 
} 

Скорее всего, вы были в замешательстве с именем typedef и предположили, что это была сама структура.

Кроме того, если вы хотите указатель на структуру, а затем объявить указатель на структуру:

_cpinfo *whatever;

Скрытие указатели позади ЬурейеЕ могут быть использованы в течение вашего любимого C API, но я не» Рекомендуем сделать это в своем собственном коде, как указано @CaptainOblivious.

Смежные вопросы