【问题标题】:How does structure array copying work in C?结构数组复制如何在 C 中工作?
【发布时间】:2016-06-11 00:09:16
【问题描述】:

这是我想在 C 中运行的代码。

#include<stdio.h>
#include<string.h>
main()
{
    struct record {
        char name[2];
        char letter;
    };

    struct record student[10];
    strcpy(student[0].name,"t");//copy "t" to first struct's name variable
    strcpy(student[1].name,"ri");//copy "ri" to second struct's name variable
    student[0].letter='a';//copy "a" to first struct's letter variable
    student[1].letter='b';//copy "b" to second struct's letter variable
    printf("%s %s %c %c", student[0].name, student[1].name, student[0].letter, student[1].letter);
}

我期望的输出是:t ri a b

但是我得到:t rib a b

我做错了什么?

【问题讨论】:

    标签: c arrays structure strcpy


    【解决方案1】:

    strcpy(student1.name,"ri");//复制“ri”到第二个结构的名字 变量

    这绝对是错误的。 "ri" 实际上也是三个字符,因为空终止符也是如此。因此,您将三个字节复制到具有 2 个字节的数组中,从而调用 undefined behaviour

    【讨论】:

    • 那我该怎么办?我是否应该将结构中 name 变量的大小从 name[2] 增加到 name[3] 以使其在这种情况下工作?
    • @rohitkrishna094 是的,如果你增加到 3,它会在这种情况下工作。但也许你需要更大的数组
    • 哦,这样做,它奏效了。非常感谢您的及时帮助。我知道空字符,但在编写此代码时忘记了它。谢谢。
    【解决方案2】:

    在您的代码中,name 是一个包含两个 chars 的数组。 OTOH,"ri" 的大小是三个字符,包括空终止符。

    所以说

      strcpy(student[1].name,"ri");
    

    你超出了内存。这会调用undefined behavior

    来自man page

    [...] 字符串不能重叠,并且目标字符串dest 必须足够大以接收副本。 [...] 如果strcpy() 的目标字符串不够大,那么任何事情都可能发生。

    一旦你点击了UB,程序的行为就不能被证明是合理的。

    为了能够持有"ri",你需要改变

    char name[2];
    

    char name[3];
    

    【讨论】:

      【解决方案3】:
      #include<stdio.h>
      #include<string.h>
      main()
      {
          struct record {
              char name[3];
              char letter;
          };
      
          struct record student[10];
          strcpy(student[0].name,"t");//copy "t" to first struct's name variable
          strcpy(student[1].name,"ri");//copy "ri" to second struct's name variable
          student[0].letter='a';//copy "a" to first struct's letter variable
          student[1].letter='b';//copy "b" to second struct's letter variable
          printf("%s %s %c %c",student[0].name,student[1].name,student[0].letter,student[1].letter);
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-10
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        相关资源
        最近更新 更多