C函数在数组参数处崩溃

C函数在数组参数处崩溃,c,embedded,C,Embedded,我编写了一个函数,如下所示: void func1(char chx[], int y) { int wsn = 0; wsn = *(int *) (&chx[2]); if (wsn == 0) { ... } } 编译器工作正常,没有警告,没有错误。但是当代码运行时,它似乎得到了一个狂野的指针。代码崩溃了。 但下面这样的代码效果很好: wsn = (chx[5]<< 24) + (chx[4] << 16) +

我编写了一个函数,如下所示:

void func1(char chx[], int y) 
{
    int wsn = 0;

    wsn = *(int *) (&chx[2]);
    if (wsn == 0) {
    ...
    }
 }
编译器工作正常,没有警告,没有错误。但是当代码运行时,它似乎得到了一个狂野的指针。代码崩溃了。 但下面这样的代码效果很好:

wsn = (chx[5]<< 24) + (chx[4] << 16) + (chx[3] << 8) + chx[2];
wsn=(chx[5]正如我在一篇关于这个问题的文章中所观察到的,如果你传递一个未对齐的地址并试图将其视为一个
int*
,一些机器就不喜欢这样。例如,许多RISC机器要求4字节数量的地址在4字节边界上对齐,但是任意的
char*
不一定足够对齐。如果你得到一个
SIGBUS
错误而不是
SIGSEGV
,这通常是故障的强烈迹象

由于该网站突出提到了“RISC”并确认了这一点,我有点相信您的问题在于传递给
func1()
的地址没有足够的对齐,因此
&chx[2]
的有效地址可能是4字节
int*

执行字节操作的代码之所以有效,是因为它只要求数据是字节对齐的,并且字节寻址机器上的所有数据都是字节对齐的

<>你可以考虑使用:

void func1(char chx[], int y) 
{
    int wsn = 0;
    int *ip = (int *)&chx[2];
    if ((uintptr_t)ip & 0x3 == 0)
        wsn = *ip;
    else
        wsn = (chx[5]<< 24) + (chx[4] << 16) + (chx[3] << 8) + chx[2];
    if (wsn == 0)
    {
        …
    }
}
void func1(字符chx[],整数y)
{
int wsn=0;
int*ip=(int*)&chx[2];
if((uintpttr_t)ip&0x3==0)
无线传感器网络=*ip;
其他的

无线传感器网络=(chx[5]什么平台?如果您传递一个未对齐的地址并试图将其视为
int*
,有些机器不喜欢它。例如,许多RISC机器要求4字节数量的地址在4字节边界上对齐,但任意的
char*
不一定足够对齐。如果您得到
SIGBUS
error这通常是故障的强烈指示,而不是
SIGSEGV
。SH 32位MCU,Renessas产品。