[英]Cast struct pointer to char* and copy
我有以下代碼
struct Info { int age; char name[5]; }
char buffer[20];
Info i;
i.age = 10;
sprintf(i.name, "Case");
strncpy(buffer+5, (char*)&i, sizeof(Info));
現在我想要恢復記錄
Info j;
strncpy((char*)&j, buffer+5, sizeof(Info));
printf("%d %s", j.age, j.name);
但是,這會打印名稱的空字符串。 我不確定我做錯了什么。
復制機制有兩個問題:
sizeof(Info)
是5.那絕對不是這樣的。 strncpy
,這是用於字符串的。 Info
不是字符串,因此您需要使用memcpy
。 以下將有效:
char buffer[sizeof(i)];
memcpy(buffer, &i, sizeof(i));
...
memcpy(&j, buffer, sizeof(j));
還有另一個問題; name[5]
不足以容納"Casey"
,因為一旦你考慮了null終止符,就會有6個字符。
有幾件事:
char name[5]
不能容納"Casey"
,終結符將不適合。 這會導致未定義的行為。 &i
,就好像那是指向字符串的指針,而實際上它指向一個struct
,其第一場是int
。 這將無法可靠地工作。 您發布的代碼存在幾個問題。 首先,考慮到“Casey”必須為空終止, info
的name
字段太短。
你做的觀察是由於另一個問題。 j
的地址不會與其name
字段對齊。 在那個地方仍然存在一個int age
,並且很可能name
字段在4個字節之后開始,但這是由編譯器自行決定的。
至於恢復age
,這是行不通的,因為它從未存儲到緩沖區。
假設buffer
足夠大,可以使用memcpy(buffer, &i, sizeof(Info))
來存儲,前兩個參數切換為重建。 在這里使用sizeof
會有所幫助,因為這樣你就可以向編譯器詢問結構Info
在內存中布局這個結構的方式有多大。
您不需要使用memcpy()來復制Info
變量。 你可以使用賦值運算符:
Info j;
j = i;
printf("%d %s", j.age, j.name);
您可以這樣做,因為Info
不包含指針成員變量,因此在使用賦值運算符時您將獲得深層復制。 如果您只使用默認的復制構造函數,也會發生同樣的情況:
Info j(i);
要么:
Info j = i;
當然,正如其他人所指出的那樣,你應該使Info::name
足夠大,以容納你打算存儲在其中的名稱,包括'\\0'
字符串終止符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.