c - C 函数中保留的数据

标签 c function memory-address

在C语言中,一个变量可以有一个内存地址和一个值。 据我了解,每个函数都有一个地址以及分配在该地址的数据。我的问题是这些函数指向的数据的含义是什么?

最佳答案

你已经得到了(好的)答案,但我认为关于你的问题,应该指出一些关于 C 的(模糊的?)事实:

In C programming language, a variable can have a memory address and a value.

实际上,变量的定义属性是总是有一个值——如果它未初始化,语义上它仍然有一个值,只是这个值是“未定义的值”并且读取“未定义的值”调用未定义的行为。

但是,这很重要,并不是 C 中的每个变量都有地址!有一个小的存储分类器register,它的确切含义大多数人并不完全理解。最普遍也是错误的解释是,register 意味着变量只能放在寄存器中。问题是:有些指令架构中不存在寄存器,但 C 语言的设计使其对它们仍然可行。

register 分类器的真正含义是,您不能获取register 变量的地址,这意味着您不能创建指向它的指针。

这样做的结果是,register 变量唯一重要的是它的值。 C 编译器生成完全丢弃其值所在“位置”(无论是寄存器、内存位置还是完全不同的东西)的代码是完全合法的,只要它能够忠实地重新创建值方式,它在语义上符合程序文本。 这也意味着,对为获得最终值而必须执行的任何操作进行整体重新计算是完全合法的。这就是为什么将 register 存储限定符应用于变量可能会导致代码大小突然增加和性能下降

因此,register 存储限定符不是用于优化 代码的机制,而应该被视为一种特殊用途的工具,用于编写既不是时间也不是大小关键的代码,但必须在非常具体、严格的约束下运作。一个例子是引导加载程序或系统初始化代码,它的任务是首先初始化内存访问并且必须使用几个字节 - 甚至没有 - 可用内存存储进行操作,但可以重新计算所需的值每一步。

关于c - C 函数中保留的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42051793/

相关文章:

javascript - 如何获取 JavaScript 变量的内存地址?

function - Vim boolean 函数

java - 链接列表 - 无法弄清楚为什么此删除最后一个功能不起作用?

无法在函数中进行函数调用以正常工作

c - 复制 strchr()

c++ - 如何测量C++中的内存分配时间?

process - 虚拟内存和物理内存

ada - 可以修改通过 'address 属性传递给过程的变量吗?

c - 为什么我的输出为空?

c - While循环导致程序崩溃