strcat和静态分配的字符数组会发生什么情况?

strcat和静态分配的字符数组会发生什么情况?,c,static,C,Static,我在一些遗留代码中发现了这一点 static char title1[] = "SUMMARY REPORT"; static char title2[] = "PERIOD: "; ... strcat(title2, "10/10/2011"); 此strcat操作导致标题1被部分日期字符串覆盖。我能够在一个小程序中重现这一点,但不能使用静态数组。我查看了遗留代码中的内存位置,标题2缓冲区位于标题1之前。修复方法很简单,我只是在标题2中添加了一个长度(这将标题1的开头进一步推到了内存中

我在一些遗留代码中发现了这一点

static char title1[] = "SUMMARY REPORT";
static char title2[] = "PERIOD: ";

...

strcat(title2, "10/10/2011");
此strcat操作导致标题1被部分日期字符串覆盖。我能够在一个小程序中重现这一点,但不能使用静态数组。我查看了遗留代码中的内存位置,标题2缓冲区位于标题1之前。修复方法很简单,我只是在标题2中添加了一个长度(这将标题1的开头进一步推到了内存中),以保存整个日期。为什么在记忆中标题2在标题1之后?顺便说一句,这是SPARC上的

为什么在记忆中标题2在标题1之后


为什么不呢?该标准不保证物体将放置在何处。您显示的代码从根本上是错误的
strcat
目标应该包含一个C字符串,并且足够大以包含连接的结果字符串。

strcat
假设您传入的缓冲区足够大以容纳连接的字符串,如果它太小,它将覆盖缓冲区的末尾。因此,缓冲区后面的任何内容都会被覆盖。

title2
位于
title1
后面,因为编译器将其放在那里。该标准没有指定内存布局,编译器可以按照编译器编写人员最简单的顺序自由地执行。我不会说这从根本上是错误的,但在逻辑上是错误的。strcat dest是一个C字符串;皮特·威尔逊:我仍然认为满足函数的先决条件是最基本的。