0

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;
}

输出我得到:

part number
j9uijd9d09fj
abcseven
seven
aaaaaaaa
ptypeuser
user

谢谢!!!

4

5 回答 5

4

c3将结构中的大小更改为4c66允许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];
};
于 2012-09-17T12:46:00.977 回答
1

printfwith%s打印一个以 null 结尾的字符串。s3(and s6) 在这种情况下,空终止字符被覆盖,c所以printf当它到达下一个字符时停止打印,即 after seven

于 2012-09-17T12:46:52.177 回答
1

您的代码在两件事上是错误的:

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

可能你想使用strcpy().

甚至strncpy,但要小心!这个功能并没有像大多数人想象的那样......在使用它之前至少阅读文档两次。

于 2012-09-17T12:51:06.547 回答
0

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

对于c6结构的成员也是如此。

于 2012-09-17T12:48:09.733 回答
0

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

构造它们时的字符序列总是比您输入的字符数长一个字符。末尾的附加字符是 NUL 终止符。

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

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

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

于 2012-09-17T12:53:32.927 回答