【问题标题】:Scope of variables in C, why is function modyfing values in main?C中变量的范围,为什么函数在main中修改值?
【发布时间】:2021-08-01 09:37:55
【问题描述】:
#include <stdio.h>
#define MAXLINE 100

int get_line(char line[], int maxline);
void copy(char to[], char from[]); 


/*Prints longest input line*/

int main(){
    int len; /*Current line length*/
    int max; /*Maximum length so far*/
    char line[MAXLINE]; /*Current input line*/
    char longest[MAXLINE]; /*Longest line is saved here*/

    max = 0;
    while ((len = get_line(line, MAXLINE)) > 0){
        if (len > max){
            max = len;
            copy (longest, line);
        }
    }
    
    if (max > 0) 
        printf("%s", longest);

    return 0;
}

/*get_line: read a line into s, return length*/

int get_line(char s[], int lim){
    int c, i;
    for (i = 0; (i < lim - 1) && (c = getchar()) != EOF && (c != '\n'); ++i)
        s[i] = c;
    if (c == '\n'){
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}

/*copy: Copy 'from' into 'to'*/

void copy (char to[], char from[]){
       int i;
       i = 0;

       while((to[i] = from[i]) != '\0')
           ++i;
}

此代码来自C 编程语言 的第 1.9 节,我试图了解它是如何工作的。我不明白变量的范围是如何工作的。在while循环中,函数get_line正在修改变量line,函数copy正在修改变量longest

它们不应该只在函数的范围内吗?我不明白为什么函数能够在main中修改它们

【问题讨论】:

  • 您将from 的范围与它指向的内存内容混合在一起。请记住:将数组传递给函数时,它会衰减为指向第一个元素的指针
  • FWIW, for (i = 0; (i &lt; lim - 1) &amp;&amp; (c = getchar()) != EOF &amp;&amp; (c != '\n'); ++i)horrible 代码。将这么多东西塞进一行中,除了混乱之外,没有任何收获。将赋值、减法和 三个 比较填充到三个 for() 循环表达式的中间,对于任何人脑来说,一次都无法解析。人脑在任何时候只能准确地跟踪 3 到 6 个状态/操作,而中间的表达式使用了其中的 5 个。这是您无法理解这段代码的作用的一个重要原因。

标签: c scope


【解决方案1】:

数组的名字实际上是一个指向第一个元素的指针。
[] 运算符的作用与 *(array + n)

相同

编辑:正如 cmets 中所指出的,这可能会造成混淆和误导。
我建议你看看这个问题:Is an array name a pointer?

int a[10];
a[1] == *(a + 1) // true

get_line()copy() 的参数类型为char[],与char* 相同。
您将 linelongest 的内存地址传递给了这些函数。

变量在超出范围时并非完全不可访问,
您只是不能使用名称直接引用它们。
通常函数参数是传递给函数的原始值的副本,
因此更改它们不会影响原始变量。

但在这种情况下,您传递的是变量的内存地址,这些函数能够通过指针更改数组元素的值。

【讨论】:

  • 数组的名称实际上是指向第一个元素的指针 不完全确定您的意思,但数组不是指针,但数组在传递给函数时会衰减为指针。如果这就是您的意思,请您在回答中澄清一下吗?
  • 嗯,但它们确实可以用作指针,甚至可以用作变量,这就是为什么您可以手动获取元素的值,例如*(a+1)。除非在它们上使用sizeof,在这种情况下它们将返回整个数组的值。您究竟希望我如何编辑我的答案?
  • 我相信当你+它时它也会衰减为指针。我想如果你澄清数组和指针不是一个和相同的会很有帮助(因为对我来说,你似乎从第一句话就这么说了),但是数组到指针的衰减意味着当你将数组作为参数,它在函数中使用时就像一个指针。
  • @mediocrevegetable1 我已经为这个数组指针的东西添加了一个问题链接:)
猜你喜欢
  • 1970-01-01
  • 2011-07-03
  • 2022-07-07
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多