2012-07-27 44 views
0

我有一个关于在结构及其可靠性上使用memset和memcopy的查询。对于如:Memcpy和Memset在C中的短类型结构

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

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我得到m.a和m.b为514而不是2.当我把它们作为字符而不是短的它是好的。这是否意味着我们不能将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)); 

收集这些指针在这种情况下,如果我或存储器复制的memset的它只会改变地址,而不是价值。我如何改变这些值呢?原型是否错误?

请建议。您的投入都非常小鬼

感谢 DSP家伙

回答

1
  1. 的memset集的字节,而不是短裤。总是。出现在字节边界上的514 =(256 * 2)+(1 * 2)... 2s。 1.a.诚然,这确实减少了它对于你想要做的(数组填充)等目的的有用性。
  2. 只要两个结构都属于同一类型就可靠。只是要清楚,这些结构不像您所建议的那样是“简短”的。
  3. 如果我理解你的问题,只要他们属于同一类型,我不认为它很重要。

只要记住,这些是字节级别的操作,没有什么更多,没有什么更少的。另见this

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

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

注意两个操作从两个不同的地址(m.pa复制,m.pb是因为你还认得有效地解决了)还要注意的sizeof:不和sizeof的引用,但的sizeof。什么是引用。类似的memcopy。

+0

嗨理查德,感谢您的答复。我的问题米是我的所有数据为16位字。如果memset只在字节上工作,那么我不能在单词上使用它,因为它给了我错误的答案。它是否正确? – user437777 2012-07-27 05:44:15

+0

你有两个例外是正确的:你可以用它来填充0或-1(0xFF)。对其他值不太有用。 – 2012-07-27 05:48:12

+0

谢谢理查德。现在清楚了。我已经更新了一个查询,将不胜感激您的输入 – user437777 2012-07-27 05:51:29