struct上的memcpy错误

时间:2012-09-17 12:43:18

标签: c struct memcpy

我在memcpy中遇到以下错误。它没有给出编译错误,但没有给出我想象的结果。我之前从未使用过memcpy所以我确定我犯了一个简单的错误。我已经查看过以前的问题,但找不到结构问题。我可以在独立变量上使用memcpy,但不能在结构上使用。

如果有人可以指出我的错误那就太棒了。

#include <stdio.h>
#include <string.h>


int main() {
 struct st{
 char c1[12];
 char c2[32];
 char c3[3];
 char c4[7];
 char c5[13];
 char c6[5];
 char c7[10];
 };
 struct st s;
 char s1[] = "part number";
 char s2[] = "j9uijd9d09fj";
 char s3[] = "abc";
 char s4[] = "seven";
 char s5[] = "aaaaaaaa";
 char s6[] = "ptype";
 char s7[] = "user";
 memcpy(s.c1,s1,sizeof(s.c1));
 memcpy(s.c2,s2,sizeof(s.c2));
 memcpy(s.c3,s3,sizeof(s.c3));
 memcpy(s.c4,s4,sizeof(s.c4));
 memcpy(s.c5,s5,sizeof(s.c5));
 memcpy(s.c6,s6,sizeof(s.c6));
 memcpy(s.c7,s7,sizeof(s.c7));
 printf("%s\n",s.c1);
 printf("%s\n",s.c2);
 printf("%s\n",s.c3);
 printf("%s\n",s.c4);
 printf("%s\n",s.c5);
 printf("%s\n",s.c6);
 printf("%s\n",s.c7);
 return 0;
}

OUTPUT我收到了:

part number
j9uijd9d09fj
abcseven
seven
aaaaaaaa
ptypeuser
user

感谢!!!

5 个答案:

答案 0 :(得分:3)

将结构中c3的大小更改为4,将c6更改为6以允许NULL终结符。

struct st{
    char c1[12];
    char c2[32];
    char c3[4]; /* putting 'abc' which is 4 chars */
    char c4[7];
    char c5[13];
    char c6[6]; /* putting 'ptype' which is 6 chars */
    char c7[10];
};

答案 1 :(得分:1)

带有printf

%s打印以空字符结尾的字符串。 s3(和s6)在这种情况下由c覆盖了空终止字符,因此printf在到达下一个seven时会停止打印它。 1}}。

答案 2 :(得分:1)

你的代码有两件事是错误的:

  1. s.c3长度为3个字符,因此没有额外NUL字节的空间。这就是为什么你在打印时将它与下一个连接起来的原因。
  2. 在某些情况下,您复制的字节数多于原始字符串中的字节数:memcpy(s.c2,s2,sizeof(s.c2))正在复制32个字节,但原始字符串要短得多。这是未定义的行为。
  3. 您想使用strcpy()的Probabl。

    甚至strncpy,但要注意!这个功能并不能满足大多数人的想法......在使用之前至少阅读两次文档。

答案 3 :(得分:0)

在结构中,成员c3是一个包含三个字符的数组。然后将四个字符复制到其中!请记住,字符串有一个额外的字符结束字符串,因此字符串"abc"实际上是四个字符:'a''b''c'和终止符'\0'

结构的c6成员也一样。

答案 4 :(得分:0)

您面临的问题是缺少字符序列的NUL终止符。

构造函数的字符序列总是比你键入的字符数长一个字符。最后的附加字符是NUL终结符。

因此,复制内容的数组需要比要复制的字符数长一个字符。对于c3,字符数太小,导致NUL终止符为丢失。

printf然后按字符打印字符串,直到它看到NUL终结符。如果它丢失,printf只是继续读取内存,直到它到达第一个0x00字节。在这种情况下,你很幸运,因为你正在使用一个结构。结构写在一个内存块中,因此printf只会进入下一个字段。

只需确保结构中的数组大小始终大于要复制的字符序列,即可解决问题。