C 整个缓冲区初始化导致异常

C 整个缓冲区初始化导致异常,c,exception,linker,stack,stack-memory,C,Exception,Linker,Stack,Stack Memory,我很难让一段代码正常工作,我有一段代码使用带有本地缓冲区的函数, 当本地缓冲区被初始化时,我得到了异常,但当刚刚声明而没有任何初始化时,它工作正常,我不明白为什么。 我还增加了链接器中的堆栈大小,但这似乎不是问题所在 注意:我使用c99/c11编译选项进行编译,该选项支持整个缓冲区初始化 #define UDS_SRV_CFG2_MAX 20 NCS_PRI_FCT tUdsStatus UDS_RdbiManagement(u16 *puwLen, u8 *aubUdsData) {

我很难让一段代码正常工作,我有一段代码使用带有本地缓冲区的函数, 当本地缓冲区被初始化时,我得到了异常,但当刚刚声明而没有任何初始化时,它工作正常,我不明白为什么。 我还增加了链接器中的堆栈大小,但这似乎不是问题所在

注意:我使用c99/c11编译选项进行编译,该选项支持整个缓冲区初始化

#define UDS_SRV_CFG2_MAX  20

NCS_PRI_FCT tUdsStatus UDS_RdbiManagement(u16 *puwLen, u8 *aubUdsData) {

    tUdsStatus eUdsStatus;
    u8 ubTableCfgIdx[UDS_SRV_CFG2_MAX] = { 0 }; // this leads to exception
    //...
}

NCS_PRI_FCT tUdsStatus UDS_RdbiManagement(u16 *puwLen, u8 *aubUdsData) {

    tUdsStatus eUdsStatus;
    u8 ubTableCfgIdx[UDS_SRV_CFG2_MAX]; // code works fine here
    // ...
}

感谢您的回答,问题在于堆栈对齐,这会导致异常,因为平台的堆栈对齐是4byts,20字节缓冲区通过了测试,但15字节缓冲区由于错误的编译器对齐而出现异常。 通过为未对齐堆栈添加编译选项并在硬件中激活正确的标志,解决了这一问题

纳比尔


经验丰富的/电子系统工程师。

您不能“使用c99/c11编译选项编译”。您可以在C99模式下构建,也可以在C11模式下构建。你不能两者都做,它们是互斥的。你说的“整个缓冲区初始化”是什么意思?在C(C89、C99、C11)中,没有部分初始化。对象要么未初始化,要么完全(所有工作字节)初始化。您从哪里得到异常?何时调用
UDS\u rdb管理
?其他地方?您使用了调试器来定位代码中崩溃发生的位置?我认为您的意思是“初始化导致不同的未定义行为(预期与意外)”,您显示的代码中没有任何内容会导致您描述的问题。看见