79

同一の構造体を別の構造体にコピーし、後で最初の構造体との比較として使用したいと考えています。問題は、私がこのようにやっているときにコンパイラが警告を発することです! 私は別の方法でそれを行うべきですか、それとも私はこれを間違っていますか:

ヘッダー ファイル内:

extern struct RTCclk
{
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t mday;
uint8_t month;
uint8_t year;
}
RTCclk;

C ファイルの場合:

struct RTCclk RTCclk;
struct RTCclk RTCclkBuffert;

void FunctionDO(void)
{
   ... // Some Code
   /* Copy first struct values into the second one */
   memcpy(&RTCclk, &RTCclkBuffert, sizeof RTCclk);
}
4

7 に答える 7

173

単純な構造の場合はmemcpy、同じように使用するか、一方から他方に割り当てることができます。

RTCclk = RTCclkBuffert;

コンパイラは、構造をコピーするコードを作成します。


コピーに関する重要な注意: と同様に、浅いコピーmemcpyです。つまり、たとえばポインターを含む構造体がある場合、コピーされるのは実際のポインターのみであり、ポインターが指すものではないため、コピー後に同じメモリを指す 2 つのポインターが作成されます。

于 2012-02-03T10:43:02.857 に答える
18

あなたのコードは正しいです。一方を他方に直接割り当てることもできます ( Joachim Pileborg の回答を参照)。

後で 2 つの構造体を比較するときは、memcmp. C で構造体の等価性を比較するにはどうすればよいですか? を参照してください。

于 2012-02-03T10:47:57.270 に答える
4

cのコピー構造は、次のように値を割り当てるだけです:

struct RTCclk RTCclk1;
struct RTCclk RTCclkBuffert;

RTCclk1.second=3;
RTCclk1.minute=4;
RTCclk1.hour=5;

RTCclkBuffert=RTCclk1;

RTCclkBuffert.hour の値は 5 になり、

RTCclkBuffert.minute の値は 4 になります

RTCclkBuffert.second の値は 3 になります

于 2012-02-03T10:46:04.413 に答える
1

あなたのmemcpyコードは正しいです。

私の推測では、string.h のインクルードが不足しています。そのため、コンパイラは の間違ったプロトタイプを想定しているmemcpyため、警告が表示されます。

とにかく、単純にするために構造体を割り当てる必要があります(Joachim Pileborgが指摘したように)。

于 2012-02-03T11:22:12.917 に答える