我与Aurix MUC一起工作,我试图在程序执行后读取内存的内容,以了解他在回忆录中写的内容
我注意到,当我在函数中使用全局变量时,在函数中处理后该全局变量的新值未写入内存中。
这里是一个例子:
int a = 100;
void plus (int a)
{
a = a + 17;
}
int main (void)
{
plus(a);
return 0;
}
当我显示内存的内容时,我发现a的值为100
并且我找不到通常为117的a的新值。
我试图将变量a声明为volatile,但是它没有任何改变
如果我直接像这样直接在主体中进行计算
int a = 100;
int main (void)
{
a = a + 17
return 0;
}
就像我在内存中找到值117。
所以我需要了解在调用函数中使用的保存变量值在哪里?
以及为什么a的新变量未写入内存,
为什么在本地声明的变量也没有写在内存中?
答案 0 :(得分:1)
在此代码中:
int a = 100;
void plus(int a)
{
a = a + 17;
}
int a
中的void plus(int a)
声明了一个a
的新实例,该实例隐藏了先前的a
。然后,在a = a + 17;
中使用a
的这个新实例。要让plus
更改函数外部声明的a
,请使用:
int a = 100;
void plus(void)
{
a = a + 17;
}
此外,在main
中,将plus(a);
更改为plus();
。
在C语言中,每个标识符都有一个 scope ,在哪里可见源代码。任何函数外部的声明都有文件范围,这意味着声明的标识符在整个文件中都是可见的(技术上是翻译单元)。在函数定义中,参数声明具有与该函数关联的 block作用域-仅在该函数中可见。
由于int a = 100;
具有文件作用域,因此您无需在plus
中重新声明它即可使用它-它在函数内部可见,因此您可以在不使用新声明的情况下使用它