簡體   English   中英

將struct指針轉換為char *並復制

[英]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);

但是,這會打印名稱的空字符串。 我不確定我做錯了什么。

復制機制有兩個問題:

  1. 你假設sizeof(Info)是5.那絕對不是這樣的。
  2. 你正在使用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”必須為空終止, infoname字段太短。

你做的觀察是由於另一個問題。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM