为什么这个C初始化将数组地址设置为零?

时间:2017-02-28 16:24:43

标签: c arrays initialization memory-address

背景: MCU: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

bad

此代码没有。

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

good

1 个答案:

答案 0 :(得分:0)

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

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

出于上述原因,第二种选择是首选。