如果你想memcpy兩個結構,那麼他們兩個的內存必須是連續的。但是您必須事先確定num
。
struct test_struct {
int num;
char ** values;
} * TestStruct;
int _num = 0;
// find _num
TestStruct = malloc (sizeof (struct test_struct) + (sizeof(char*) * _num) + (LENGTH * _num));
TestStruct->num = _num;
TestStruct->values = &TestStruct + sizeof (struct test_struct);
for (int i = 0; i < _num; i++){
TestStruct->values[i] = &TestStruct + sizeof (struct test_struct) + (i * LENGTH);
}
我改變的char *爲char原因**是因爲使用的char *它變得更難第一(我假設他們是空值終止)後訪問字符串。另外,在調用memcpy之後,您必須更新新結構中的所有字符串指針。
memcpy的你可以這樣做:
memcpy (buf, TestStruct->values[0], LENGTH * TestStruct->num);
但buf中,但是,你只能看到第一個字符串(除非你的字符串不是空終止)。您必須在每個空終止字符後增加指針,直到您知道num
,您已達到緩衝區的末尾。
現在,我瞭解了更多關於您的請求的上下文,請考慮以下事項。
如果您使用的是UDP數據包,則應該將數據發送到一個數據包中,以便按照您期望的順序到達。當發送多個數據包時,它可能不按順序到達。
因此,您需要確保數據的大小爲< = 512字節 - 這是UDP數據包的最大大小。
另外,您需要確保所有數據都在連續內存中。我會假設你有你的數據已經在您在本示例中提供的結構:
// this function puts the struct in contiguous memory
int PrepareBuffer (struct test_struct TestStruct, char ** buffer){
char * cast = (char *) &TestStruct->num;
* buffer = malloc ((TestStruct->num * LENGTH) + sizeof (int));
for (int i = 0; i < sizeof (int); i++) *buffer[i] = cast[i];
for (int i = 0; i < (TestStruct->num * LENGTH); i++) *buffer[i + sizeof (int)] = TestStruct->values[i];
return 0;
}
你必須落實緩衝區映射到struct test_struct
接收端的另一個功能。另外,爲了清晰起見,我省略了錯誤檢查。你應該檢查數據包在分配內存之前有多大,
(它必須是< = 512)
。您還應該檢查以確保malloc返回一個非空指針。
該結構的大小是不變的 – tay10r
的結構永遠不會改變的大小,它只是'的sizeof(test_struct)'。如果你想知道分配的內存總量,那麼是的,你需要'num * sizeof(* values)' –
@泰勒正確。但是,包含它的緩衝區必須分配足夠的內存來保存'values' 。這就是爲什麼我用'num * LENGTH'計算'values'的大小,然後增加'struct'本身的大小。 – justynnuff