【问题标题】:When incrementing pointer to struct array on powerPC sizeof does not work as expected在 powerPC sizeof 上增加指向结构数组的指针时无法按预期工作
【发布时间】:2015-12-02 04:20:12
【问题描述】:

我正在为运行 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 编译器的一个奇怪的怪癖?

【问题讨论】:

  • 我不明白问题所在。我正在使用两个变量“Streamnumbers”和“Streamnumber”。
  • 或者如果你坚持乘以它应该是(char*)AGA8InputsArray + sizeof(AGA8_Inputs) * streamNumber
  • 我明白了,我之前的例子只有在我使用 char 指针时才是正确的。当编译器将我的算术视为指针算术或普通数学时,我误解了。
  • 是的,现在看起来很明显。感谢您的帮助。
  • 也感谢关于 calloc 的指针(大声笑)。我以前从未听说过(我不经常写 C)。

标签: c arrays pointers struct pointer-arithmetic


【解决方案1】:

这一行:

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

应该是:

AGA8_Inputs *AGA8Inputs = (AGA8InputsArray + streamNumber); 

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

calcStep 行有类似的修复。

注意。可以使用calloc 函数代替malloc 后跟memset

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多