因此,从我所读到的 SRAM 是易失性的,而 EEPROM 是非易失性的。如果 SRAM 是易失性的,为什么我在使用 *ptr 时有时会得到值(随机和垃圾但仍然是值)。
例如对于 ptr=&x,*ptr 可能会给我一个值。我不应该得到 NULL 因为它是易失性的,并且每次断电时都会清除 SRAM 吗?
因此,从我所读到的 SRAM 是易失性的,而 EEPROM 是非易失性的。如果 SRAM 是易失性的,为什么我在使用 *ptr 时有时会得到值(随机和垃圾但仍然是值)。
例如对于 ptr=&x,*ptr 可能会给我一个值。我不应该得到 NULL 因为它是易失性的,并且每次断电时都会清除 SRAM 吗?
就内存而言,易失性意味着在电源循环后不会保留值。鉴于 RAM 的性质,它可能在上电时包含任何垃圾值。硬件中没有任何东西可以将 RAM 初始化为零。
因此,如果需要,您必须手动将 RAM 初始化为零。
C 标准实际上要求对所有具有静态存储持续时间的变量进行此类初始化 - 但仅限于这些变量。在执行之前,某些固件会执行“清零”初始化main()
。但是局部 C 变量永远不会自动初始化。
请注意,volatile
C 中的关键字与易失性存储器几乎没有关系。不要混淆这两个不同的术语。
不,你混合上下文。一件事是内存波动,它与内存物理结构有关。其他是您的代码读取随机内存地址。
有时硬件可以在通电时擦除 SRAM,有时不能,你不能指望它。
如果您在代码中读取 RAM 的非占用地址,您将读取垃圾,无论是在供电过程中生成的位还是在同一个电源周期中被处理且不再使用的旧数据。