Wenn Sie bereit/erlaubt sind die unsigned char
zu einem regelmäßigen char
zu ändern, können Sie strcpy
verwenden:
#include <iostream>
#include <stdio.h>
#include <string.h>
struct __attribute__((packed)) BabelPacket
{
unsigned senderId;
unsigned dataLength;
char data[0]; // I changed this to char in order to use strcpy
};
int main(){
BabelPacket *packet = reinterpret_cast<BabelPacket *>(new char[sizeof(BabelPacket) + 5]);
packet->senderId = 1;
// Copy the string. Add NULL character at the end of
// the string to indicate its end
strcpy(packet->data, "kappa\0");
packet->dataLength = 5;
// Verify that the string is copied properly
for (int i=0;i<packet->dataLength;++i){
std::cout<<packet->data[i];
}
std::cout<<std::endl;
return 0;
}
Beachten Sie, dass dies nur funktioniert, wenn data
am Ende des struct
ist, da sonst kein zusammenhängender Speicher zur Zuweisung data
. Wenn ich die Reihenfolge der Elemente wechseln zu:
struct __attribute__((packed)) BabelPacket
{
unsigned senderId;
char data[0]; // I changed this to char in order to use strcpy
unsigned dataLength;
};
die Ausgabe des obigen Code (anstelle von „Kappa“), wäre „a“.
Eine zuverlässigere Art und Weise, wenn Sie entschlossen sind, C-Arrays zu verwenden wäre, eine maximale Anzahl von Elementen zu übernehmen und das Array preallocate, das heißt:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_NUMBER_OF_CHARACTERS 5 // Many ways to do this, I defined the macro for the purposes of this example
struct __attribute__((packed)) BabelPacket
{
unsigned senderId;
// I changed this to char in order to use strcpy. Allocate the
// max number + 1 element for the termination string
char data[MAX_NUMBER_OF_CHARACTERS+1];
unsigned dataLength;
};
int main(){
BabelPacket *packet = reinterpret_cast<BabelPacket *>(new char[sizeof(BabelPacket) + 5]);
packet->senderId = 1;
packet->dataLength = 5;
if (dataLength>MAX_NUMBER_OF_CHARACTERS){
std::cout<<"String greater than the maximum number of characters"<<std::endl;
}
// Copy the string. Add NULL character at the end of
// the string to indicate its end
strcpy(packet->data, "kappa\0");
// Verify that the string is copied properly
for (int i=0;i<packet->dataLength;++i){
std::cout<<packet->data[i];
}
std::cout<<std::endl;
return 0;
}
Dieser Code die korrekte Ausgabe erzeugt, und schützt Sie gegen Verstöße. Wie Sie sehen können, kann es ziemlich schnell unordentlich werden, weshalb ich empfehlen würde, dafür std::vector
zu verwenden. Die dataLength
kann dann automatisch als die Größe des Vektors abgerufen werden, und Sie sind immer gegen Überläufe geschützt.
Sie können nicht in Standard C++. – juanchopanza
PD: https://StackOverflow.com/Questions/688471/Variable-Sized-Struct-c Suche nach einem besseren aber. –
Dies funktioniert in C ([wie folgt] (http://stackoverflow.com/a/19293671/335858)), aber nicht in C++. – dasblinkenlight