#include<stdio.h>
int copy(char d[],char e[],int n);
int main(void)
{
char a[20]="Nice to meet you";
char b[10];
copy(a+5,b,4);
return 0;
}
int copy(char d[],char e[],int n)
{
for(int i=0;i<n;i++)
{
e[i]=d[i];
}
printf("%s\n",e);
return 0;
}
这里d
指向a+5
,e
指向b
。在这里,我理解输出将是“to m
”。
我的问题是:在 copy
函数中,如果我初始化 i
从 1
运行到 n-1
而不是 0
到 n-1
,为什么它没有给出所需的输出?
我预计新输出为“o m
”。
最佳答案
如果您在copy
中使用i
从1
循环到n - 1
,那么在调用之后
,main
中的 >copy(a + 5, b, 4)b[0]
仍将未初始化,因此访问它是未定义的行为(您也不确保 b
中的字符串以 '\0'
结尾)。即使没有,它仍然存在;要让它打印“o m”,您必须从 b + 1
开始读取,或者在 copy
中进行赋值,例如 e[i - 1] = d [i]
(如果您打算将其视为一个字符串,请确保将其以 nul 终止,或者将其视为以 nul 终止的字符串将使其从末尾读入未初始化的区域,类似地调用未定义的行为)。
关于将子数组复制到另一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44511638/