0

我有一个关于在结构及其可靠性上使用 memset 和 memcopy 的问题。例如:

我有一个看起来像这样的代码

typedef struct
    {
    short a[10];
    short b[10];
}tDataStruct;

 tDataStruct m,n;

memset(&m, 2, sizeof(m));
memcpy(&n,&m,sizeof(m));

我的问题是,

1):在 memset 中,如果我设置为 0 就可以了。但是当设置 2 时,我将 ma 和 mb 设为 514 而不是 2。当我将它们设为 char 而不是 short 时,这很好。这是否意味着我们不能将 memset 用于除 0 之外的任何初始化?它是对例如缩写的限制吗

2):在上述两个short类型的结构之间做memcopy是否可靠。我有一大串 a,b,c,d,e... 我需要确保副本是一对一的完美。

3):我最好在单个数组上使用 memset 和 memcopy,而不是像上面那样在结构中收集?

再一问,

在上面的结构中,我有变量数组。但是,如果我传递了指向这些数组的指针,并且我想将这些指针收集到一个结构中

typedef struct
    {
    short *pa[10];
    short *pb[10];
}tDataStruct;

 tDataStruct m,n;

memset(&m, 2, sizeof(m));
memcpy(&n,&m,sizeof(m));

在这种情况下,如果 i 或 memset 的 memcopy 它只会更改地址而不是值。我该如何更改这些值?原型错了吗?

请建议。你的投入非常小

谢谢dsp大佬

4

1 回答 1

1
  1. memset 设置的字节,而不是短裤。总是。514 = (256*2) + (1*2)... 2s 出现在字节边界上。1.a. 诚然,这确实降低了它对诸如您尝试做的目的(数组填充)的有用性。
  2. 只要两个结构的类型相同,就可靠。为了清楚起见,这些结构不是您建议的“短类型”。
  3. 如果我理解您的问题,只要它们属于同一类型,我认为这并不重要。

请记住,这些是字节级别的操作,仅此而已。另请参阅

对于您问题的第二部分,请尝试

memset(m.pa, 0, sizeof(*(m.pa));
memset(m.pb, 0, sizeof(*(m.pb));

请注意从两个不同地址复制的两个操作(m.pa、m.pb 是您认识的有效地址)。还要注意 sizeof:不是引用的 sizeof,而是被引用的 sizeof。对于内存复制也是如此。

于 2012-07-27T05:39:40.900 回答