我有以下代码在循环中将字符串附加到另一个。
代码
#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;而且,结果也不是我所期待的。有人可以为我澄清这个吗?
答案 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";
或类似。