Loop之后的输出错误是由strcat引起的?

时间:2015-10-04 15:02:59

标签: c loops strcat

我有以下代码在循环中将字符串附加到另一个。

代码

#include<stdio.h>
#include<string.h>

int main(void){
        char src1[] = "name";
        int i;
        for (i=1;i<=5;i++){
                strcat(src1,"opps");
                printf("loop times %d\n",i);
        }
                printf("now src1 is:%s\n",src1);
        return 0;
}

为了调试代码,我在代码中添加了printf语句并对其进行了编译。当我跑步时,我得到以下结果:

输出

循环次数1 循环次数0 循环时间1886416641 现在src1是:nameoppsoppsopps

我的问题是&#34;为什么printf循环1886416641次?&#34;而且,结果也不是我所期待的。有人可以为我澄清这个吗?

3 个答案:

答案 0 :(得分:3)

只有5个字节分配给str1,而strcat将访问越界,然后它可能会导致未定义的行为。

偶然得到1886416641号。

您必须为str1分配足够的内存才能获得正常结果 例如:char src1[32] = "name";

答案 1 :(得分:3)

您的src1[]不够大。当您追加第二个“opps”时,它会覆盖i。值1886416641是十六进制70706f01:0x70 ='p',0x70 ='p',0x6f ='o'。

编译器已舍入到下一个32位机器字。以字节为单位的堆栈如下所示:

start:        loop1    loop2
src1[]:
    n
    a
    m
    e
    \0        o
    <fill>    p
    <fill>    p
    <fill>    s
i:
    00        \0    o
    00        00    p
    00        00    p
    01        02    s
                    \0

(堆栈不准确;某些元素实际上是反转的 - 以它为例)

答案 2 :(得分:1)

根据strcat()的{​​{3}}

,只是为现有答案添加一些细节
  

char *strcat(char *dest, const char *src);

     

strcat()函数将src字符串附加到dest字符串,覆盖dest末尾的终止空字节('\ 0'),然后添加一个终止空字节。字符串可能不重叠,** dest字符串必须有足够的空间用于结果。如果dest不够大,程序行为是不可预测的; [...]

如果您的最终字符串的长度超过了目标可以存储的长度,您将访问超出范围的内存,从而导致man page

在您的代码中,src1从初始化字符串的长度获取其大小。稍后,如果要存储较长的存储空间,则需要在开头分配更多存储空间,例如

char src1[128] = "name";

或类似。