【问题标题】:memcpy error on struct结构上的memcpy错误
【发布时间】:2012-09-17 12:43:17
【问题描述】:

我在使用 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

谢谢!!!

【问题讨论】:

  • 你也可以在结构上使用 memcpy。我不太明白你想做什么。

标签: c struct memcpy


【解决方案1】:

将结构中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];
};

【讨论】:

  • c6 还需要另一个char
  • @hmjd - 在我最初的帖子之后,我注意到了这一点。现已更正。
  • @pstrjds 非常感谢!!实际上,我尝试在 for 循环中将 '\0' 设置为 ''。但我认为我在那里也犯了一个错误...... :) 无论如何它现在正在工作......谢谢
【解决方案2】:

printf%s 打印一个以 null 结尾的字符串。在这种情况下,s3(和s6)的空终止字符被c 覆盖,因此printf 在到达下一个字符时停止打印,也就是seven 之后。

【讨论】:

    【解决方案3】:

    你的代码有两个错误:

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

    您可能想使用strcpy()

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

    【讨论】:

      【解决方案4】:

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

      结构的c6 成员也是如此。

      【讨论】:

        【解决方案5】:

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

        当你构造它们时,一个字符序列总是比你输入的字符长一个字符。最后的附加字符是 NUL 终止符。

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

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

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

        【讨论】:

        • NUL 终止符。仅 1 L。 NULL 是一个指针。 NUL 有时在 ASCII 命名法中用于 0 字符。
        • @user1558399 您应该选择您认为正确的答案,并用绿色勾号标记已回答的问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-15
        • 1970-01-01
        • 2013-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多