【问题标题】:strcpy issue with structure in CC中结构的strcpy问题
【发布时间】:2018-09-06 19:22:26
【问题描述】:

strcpy(course.Name, b)前后的course.Code的内容是“This”和“Thisis”,看来strcpy()也是把b的内容拼接到course.Code上

typedef struct {
    char Code[4];
    char Name[2];
}Course;

int main() {
    char str[7] = "This is";
    char a[4], b[2];
    Course course;
    sscanf(str, "%s %s", a, b);
    strcpy(course.Code, a);
    printf( "%s\n", course.Code );
    strcpy(course.Name, b);
    printf( "%s\n", course.Code );
   return(0);
}

【问题讨论】:

  • 你最好希望没有人为Code输入超过3个字符或为Name输入超过1个字符。
  • 这只是我描述情况的简单方式,但感谢提醒

标签: c strcpy


【解决方案1】:

您需要五个字符来存储“This”,三个字符来存储“is”,因为每个字符串都以零结尾。 (奖励点:你需要八个来存储“这是”)

course 中的原始内存将如下所示:

Code[0] 'T'
Code[1] 'h'
Code[2] 'i'
Code[3] 's'
Name[0] 'i'
Name[1] 's'

由于course.Code 上没有终止零,printf 将继续打印。它无法知道您希望它在四个字符后停止。在“Thisis”之后您没有得到不可读的垃圾这一事实很大程度上取决于运气和/或编译器设置。

【讨论】:

  • 另请注意,不能保证Name 成员的存储与Code 成员的存储相邻,尽管观察到的行为似乎表明在这种情况下确实如此.结构布局可以在每个成员之后包含任意数量的填充。
  • @JohnBollinger 这是一个很好的观点。如果结构成员之间有任何填充,strcpy(course.Code, a); 会将终止的零复制到填充中,而 tungts 可能永远不会注意到任何异常行为。
  • ... 这只是覆盖数组边界会产生未定义行为的原因之一。
猜你喜欢
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 2021-08-18
相关资源
最近更新 更多