在powerPC上增加指向struct数组的指针sizeof不能按预期工作

时间:2015-12-02 04:20:13

标签: c arrays pointers struct pointer-arithmetic

我正在编写运行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->元素或* calcStep == 0

时获取数据访问冲突

现在,当我执行以下操作时问题就消失了:

AGA8_Inputs *AGA8Inputs = AGA8InputsArray;
int *calcStep = calcStepArray;
AGA8Inputs += streamNumber;
calcStep += streamNumber;

不应该是sizeof(AGA8_Inputs)* streamNumber与+ = streamNumber完全相同吗?或者这是PowerPC编译器的奇怪怪癖?

1 个答案:

答案 0 :(得分:4)

这一行:

AGA8_Inputs *AGA8Inputs = (AGA8InputsArray + sizeof(AGA8_Inputs) * streamNumber); 

应该是:

AGA8_Inputs *AGA8Inputs = (AGA8InputsArray + streamNumber); 

AGA8InputsArray是一个指针,因此向其添加一个整数会执行指针算术运算。将1添加到指针使指针指向其类型的下一个对象,依此类推。

calcStep行也有类似的解决方法。

NB。可以使用calloc函数代替malloc,后跟memset