Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C初始化会将数组地址设置为零?_C_Arrays_Initialization_Memory Address - Fatal编程技术网

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

为什么C初始化会将数组地址设置为零?,c,arrays,initialization,memory-address,C,Arrays,Initialization,Memory Address,背景: 微控制器:MKL26Z128 IDE:Kinetis设计工作室3.0.0 此代码将USBStringDescriptor的地址设置为零 uint8_t usbStringDescriptors[NUM_OF_STRING_DESCRIPTORS][MAX_BYTES_PER_USB_STRING] = {0}; uint8_t manStringDescriptor[MAX_BYTES_PER_USB_STRING] = {0}; …从列表文件中删除 225

背景: 微控制器:MKL26Z128 IDE:Kinetis设计工作室3.0.0

此代码将USBStringDescriptor的地址设置为零

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
 225                .LFE57:
 227                    .comm   usbStringDescriptors,198,4
 228                    .comm   manStringDescriptor,66,4
…在地图文件中

 .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                    .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
 225                .LFE57:
 227                    .comm   usbStringDescriptors,198,4
 228                    .comm   manStringDescriptor,66,4

由于这些数组具有静态存储,因此无论是否放置
{0}
初始值设定项,实际上都没有区别。当控件到达
main()
函数时,它们将被初始化为
0

  • 如果放置初始值设定项,则数据可能存在于可执行文件中,从而使其更大,加载速度也可能较慢
  • 如果没有,数据将位于未初始化的段(也称为bss或common段)中,并在正常环境中由加载程序初始化为0

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

由于这些数组具有静态存储,因此无论是否放置
{0}
初始值设定项,实际上都没有区别。当控件到达
main()
函数时,它们将被初始化为
0

  • 如果放置初始值设定项,则数据可能存在于可执行文件中,从而使其更大,加载速度也可能较慢
  • 如果没有,数据将位于未初始化的段(也称为bss或common段)中,并在正常环境中由加载程序初始化为0

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

因为第一个表示=0,第二个表示不为0?为什么第二个代码要将值设置为零?与第一段代码不同,您没有要求它。因为数组不是指针,所以数组不可能有0“值”。如果使用将0显示为其值的数组不会导致崩溃,我认为这是调试器的问题,您应该忽略它。您可以显示用于获得该结果的所有代码吗?一个完整的例子将有助于确保不是其他东西将指针设置为null。我们需要可编译和可执行的代码,或者水晶球,而我的代码目前已不再使用……因为第一个代码表示=0,第二个代码表示不为0?为什么第二个代码要将值设置为零?与第一段代码不同,您没有要求它。因为数组不是指针,所以数组不可能有0“值”。如果使用将0显示为其值的数组不会导致崩溃,我认为这是调试器的问题,您应该忽略它。您可以显示用于获得该结果的所有代码吗?一个完整的示例将有助于确保指针指向null不是其他设置。我们需要可编译和可执行的代码,或者一个水晶球,而我的当前已不再使用。。。