我有一个基本的澄清。这是我试过的代码片段。
void fill(char s[])
{
strcpy(s,"temp");
}
int main()
{
char line[100];
fill(line);
printf("%s",line);
return 0;
}
正如预期的那样,输出为temp
。line
是一个本地数组,但它可以在fill
中修改并反映在调用者中。我的理解是,这是有效的,因为当我们说fill(line)
时,我们实际上是在传递一个数组的起始地址。
我说错了吗?
答案 0 :(得分:3)
是的,你是对的。
请注意,这是危险的代码 - 使用这种类型的代码非常容易fill
覆盖传入缓冲区的末尾。填充应该知道缓冲区的大小,不应写入超过该大小的末尾。
例如,如果不是在“战争与和平”的内容中写入“temp”,那么该程序将很乐意覆盖许多与变量line
无关的其他内存位置。
答案 1 :(得分:0)
是的,数组在C中通过引用传递。
答案 2 :(得分:0)
是。在这种情况下,数组名称会衰减为指针,然后传递给fill。
答案 3 :(得分:0)
是的,使用基址
传递数组答案 4 :(得分:0)
是。那是对的。如果要显式指定起始地址,代码只会稍微改变。请参阅以下内容:请注意,fill函数参数现在是一个指针。
void fill(char *s)
{
strcpy(s,"temp");
}
int main()
{
char line[100];
fill(line);
// EQUIVALENT: fill(&line[0]);
printf("v%s\n",line);
return 0;
}