关于char数组的澄清

时间:2011-10-21 16:48:36

标签: c

我有一个基本的澄清。这是我试过的代码片段。

void fill(char s[])
{
    strcpy(s,"temp");
}

int main()
{
    char line[100];
    fill(line);
    printf("%s",line);
    return 0;
}

正如预期的那样,输出为templine是一个本地数组,但它可以在fill中修改并反映在调用者中。我的理解是,这是有效的,因为当我们说fill(line)时,我们实际上是在传递一个数组的起始地址。

我说错了吗?

5 个答案:

答案 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;
}