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产品。