我在一些遗留代码中发现了这一点。
static char title1[] = "SUMMARY REPORT";
static char title2[] = "PERIOD: ";
...
strcat(title2, "10/10/2011");
此strcat操作导致title1被日期字符串的一部分覆盖。我能够在一个小程序中重现这个,但不能用静态数组重现。我查看了遗留代码中的内存位置,title2缓冲区位于title1之前。修复很简单,我只是为title2添加了一个长度(在内存中进一步推动了title1的开始)来保存整个日期。为什么title2在内存中落后于title1?这是在SPARC上,顺便说一句。
答案 0 :(得分:3)
为什么title2在内存中落后于title1?
为什么不呢?该标准不保证对象的位置。你展示的代码根本就是错误的。 strcat
目标应包含一个C字符串,并且足够大以包含连接的结果字符串。
答案 1 :(得分:0)
strcat
假设您传入的缓冲区足以容纳连接的字符串,如果它太小,它将覆盖缓冲区的末尾。所以无论你的缓冲区后面是什么都会被覆盖。