C 不同位置函数调用的不同答案

C 不同位置函数调用的不同答案,c,arrays,C,Arrays,我有以下代码: //function to delete the occurence of c in s void squeeze(char s[], int c) { int i,j; for(i=j=0;s[i]!='\0';i++) if(s[i]!=c) s[j++]=s[i]; s[j]='\0'; } //function to concatenate string void strca(char c[],char b[]){ int i,

我有以下代码:

//function to delete the occurence of c in s
void squeeze(char s[], int  c) {
  int i,j;
  for(i=j=0;s[i]!='\0';i++)
    if(s[i]!=c)
       s[j++]=s[i];
  s[j]='\0';
}

//function to concatenate string 
void strca(char c[],char b[]){
  int i,j;
  i=j=0;
  while(c[i]!='\0')
    i++;
  c[i++]=' ';
  while((c[i++]=b[j++])!='\0')
    ;
}
现在,当我调用main()中的函数时

给出op:

删除第2行和第3行中的注释行并在第7行和第8行中添加注释时,我得到了:

我只是想知道为什么会出现这种差异,以及这种差异是如何产生的?提前谢谢

char f[]="Magnificent";
使数组
f
刚好足够容纳字符串
“华丽”
,包括0-终止符

char n[]="King Rex";
strca(f,n);
愉快地在数组边界之外写入,调用未定义的行为,并且显然在本例中覆盖了其他数组
test

如果声明数组的大小足以容纳连接结果

char f[32] = "Magnificent";

例如,所有操作都将正常工作。

您的连接函数写入c[]数组。如果要连接字符串,需要确保为两个字符串分配足够的内存(包括终止
\0

现在在您的示例中,很幸运f[]和n[]恰好在内存中相邻,所以当您用空格替换终止null时,它似乎是一个串联字符串

char f[]="Magnificent";
char n[]="King Rex";
strca(f,n);
char f[32] = "Magnificent";