2015-01-09 64 views
-5

的陣列I具有下一個方案,我有一個問題,當我在struct錯誤結構

#include <iostream> 

#include <string.h> 


struct message{ 

char msg[]; 

}; 


int main(void) 
{ 

    int i=0; 

    struct message messag[2]; 

    messag[0].msg[]={ 'a', 't','\r', '\n'}; 


    return 0; 
} 
+2

這是無效的C++。類數據成員必須具有完整的類型。 –

+0

你應該爲這部分使用['std :: copy()'](http://en.cppreference.com/w/cpp/algorithm/copy):'messag [0] .msg [] = {'a ','t','\ r','\ n'};'。該語法僅適用於編譯時初始化。 –

+0

究竟是什麼問題? – Codor

回答

1

這種結構定義

struct message{ 

char msg[]; 

}; 

是錯誤的引入數據,因爲MSG的類型不完整。數組的大小是未知的。

此外,數組還沒有賦值運算符。所以,你可能不寫這樣

messag[0].msg[]={ 'a', 't','\r', '\n'}; 

(這種說法只是syntaxically不正確的)或

messag[0].msg={ 'a', 't','\r', '\n'}; 

你可以使用的最後一條語句,如果味精定義應該像std::array<char, 4>。例如,

#include <array> 

//... 

struct message 
{ 
    std::array<char, 4> msg; 
}; 

如果在編譯時未知數組大小,那麼您需要動態分配數組。例如,你可以使用智能指針std::unique_ptr

這裏是一個示範項目

#include <iostream> 
#include <memory> 

struct message 
{ 
    std::unique_ptr<char[]> msg; 
}; 


int main() 
{ 
    message message[2]; 

    message[0].msg.reset(new char[4] { 'a', 't','\r', '\n' }); 

    return 0; 
} 

另一種方法是使用標準的類std::string。例如

#include <string> 

struct message 
{ 
    std::string msg; 
}; 

int main() 
{ 
    message message[2]; 

    message[0].msg = { 'a', 't','\r', '\n' }; 

    return 0; 
}