【问题标题】:Why does this C Initialization Set Array Address To Zero?为什么这个 C 初始化将数组地址设置为零?
【发布时间】:2017-02-28 16:24:43
【问题描述】:

背景: 单片机:MKL26Z128 IDE:Kinetis Design Studio 3.0.0

此代码将 usbStringDescriptors 的地址设置为零。

uint8_t usbStringDescriptors[NUM_OF_STRING_DESCRIPTORS][MAX_BYTES_PER_USB_STRING] = {0};
uint8_t manStringDescriptor[MAX_BYTES_PER_USB_STRING] = {0};

...来自列表文件

 225                .LFE57:
 227                    .global usbStringDescriptors
 228 001e C046          .section    .bss.usbStringDescriptors,"aw",%nobits
 229                    .align  2
 232                usbStringDescriptors:
 233 0000 00000000      .space  198
 233      00000000 
 233      00000000 
 233      00000000 
 233      00000000 
 234                    .global manStringDescriptor
 235 00c6 0000          .section    .bss.manStringDescriptor,"aw",%nobits
 236                    .align  2
 239                manStringDescriptor:
 240 0000 00000000      .space  66

...在地图文件中

 .bss.usbStringDescriptors
                0x00000000       0xc8 ./adapter/common/usb_core_ksdk/host/host_iAP.o


这段代码没有。

uint8_t usbStringDescriptors[NUM_OF_STRING_DESCRIPTORS][MAX_BYTES_PER_USB_STRING];
uint8_t manStringDescriptor[MAX_BYTES_PER_USB_STRING];

...来自列表文件

 225                .LFE57:
 227                    .comm   usbStringDescriptors,198,4
 228                    .comm   manStringDescriptor,66,4

【问题讨论】:

  • 因为第一个说 =0 而第二个没有?
  • 为什么第二个代码应该将值设置为零?与第一个代码不同,您没有要求它。
  • 由于数组不是指针,因此数组不可能有 0“值”。如果使用显示 0 作为其值的数组不会导致崩溃,我会说这是您的调试器的问题,您应该忽略它。
  • 您能否显示所有您用来获得该结果的代码?一个完整的示例将有助于确保不是将指针设置为空值。
  • 我们需要可编译和可执行的代码,或者一个水晶球,而我的目前无法使用......

标签: c arrays initialization memory-address


【解决方案1】:

由于这些数组具有静态存储,因此是否放置 {0} 初始化程序几乎没有区别。当控制到达main()函数时,它们将被初始化为0。

  • 如果您放置初始化程序,数据可能会出现在可执行文件中,从而使其变大并可能加载速度变慢,
  • 如果不这样做,数据将位于 未初始化 段(也称为 bss 或 common 段)中,并在正常环境中由加载程​​序初始化为 0。

出于上述原因,首选第二个选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-18
    • 2013-07-05
    • 2013-08-07
    • 2021-12-27
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多