在 powerPC sizeof 上递增指向结构数组的指针时无法按预期工作
When incrementing pointer to struct array on powerPC sizeof does not work as expected
我正在为运行 powerPC 并使用 powerpc-eabi-gcc 编译器的自定义嵌入式平台编写代码。
导致我出现问题的代码如下:
结构声明如下:
typedef struct
{
..lots of floats
} AGA8_Inputs;
声明数组:
AGA8_Inputs* AGA8InputsArray;
int* calcStepArray;
void init(){
AGA8InputsArray = malloc(streamNumbers*sizeof(AGA8_Inputs));
calcStepArray = malloc(streamNumbers*sizeof(int));
memset(AGA8InputsArray, 0, streamNumbers*sizeof(AGA8_Inputs));
memset(calcStepArray, 0, streamNumbers*sizeof(int));
当 streamNumber >= 1 时出现问题:
int FlowCalculation(int streamNumber)
{
// Perform AGA8 calculations
AGA8_Inputs *AGA8Inputs = (AGA8InputsArray + sizeof(AGA8_Inputs) * streamNumber);
int *calcStep = calcStepArray + sizeof(AGA8_Outputs) * streamNumber;
访问 AGA8_Inputs->element 或 *calcStep == 0 时发生数据访问冲突
现在,当我执行以下操作时,问题就消失了:
AGA8_Inputs *AGA8Inputs = AGA8InputsArray;
int *calcStep = calcStepArray;
AGA8Inputs += streamNumber;
calcStep += streamNumber;
sizeof(AGA8_Inputs)*streamNumber 不应该做与 += streamNumber 完全相同的事情吗?或者这是 PowerPC 编译器的一个奇怪的怪癖?
这一行:
AGA8_Inputs *AGA8Inputs = (AGA8InputsArray + sizeof(AGA8_Inputs) * streamNumber);
应该是:
AGA8_Inputs *AGA8Inputs = (AGA8InputsArray + streamNumber);
AGA8InputsArray
是一个指针,所以给它加一个整数进行指针运算。向指针添加 1
使指针指向其类型的下一个对象,依此类推。
calcStep
行有类似的修复。
注意。可以使用 calloc
函数代替 malloc
后跟 memset
。
我正在为运行 powerPC 并使用 powerpc-eabi-gcc 编译器的自定义嵌入式平台编写代码。
导致我出现问题的代码如下:
结构声明如下:
typedef struct
{
..lots of floats
} AGA8_Inputs;
声明数组:
AGA8_Inputs* AGA8InputsArray;
int* calcStepArray;
void init(){
AGA8InputsArray = malloc(streamNumbers*sizeof(AGA8_Inputs));
calcStepArray = malloc(streamNumbers*sizeof(int));
memset(AGA8InputsArray, 0, streamNumbers*sizeof(AGA8_Inputs));
memset(calcStepArray, 0, streamNumbers*sizeof(int));
当 streamNumber >= 1 时出现问题:
int FlowCalculation(int streamNumber)
{
// Perform AGA8 calculations
AGA8_Inputs *AGA8Inputs = (AGA8InputsArray + sizeof(AGA8_Inputs) * streamNumber);
int *calcStep = calcStepArray + sizeof(AGA8_Outputs) * streamNumber;
访问 AGA8_Inputs->element 或 *calcStep == 0 时发生数据访问冲突
现在,当我执行以下操作时,问题就消失了:
AGA8_Inputs *AGA8Inputs = AGA8InputsArray;
int *calcStep = calcStepArray;
AGA8Inputs += streamNumber;
calcStep += streamNumber;
sizeof(AGA8_Inputs)*streamNumber 不应该做与 += streamNumber 完全相同的事情吗?或者这是 PowerPC 编译器的一个奇怪的怪癖?
这一行:
AGA8_Inputs *AGA8Inputs = (AGA8InputsArray + sizeof(AGA8_Inputs) * streamNumber);
应该是:
AGA8_Inputs *AGA8Inputs = (AGA8InputsArray + streamNumber);
AGA8InputsArray
是一个指针,所以给它加一个整数进行指针运算。向指针添加 1
使指针指向其类型的下一个对象,依此类推。
calcStep
行有类似的修复。
注意。可以使用 calloc
函数代替 malloc
后跟 memset
。