【问题标题】:Allocate array of struct and then access it using an array method give compilation error分配结构数组,然后使用数组方法访问它会产生编译错误
【发布时间】:2020-11-28 05:05:46
【问题描述】:

我分配结构数组并尝试使用数组索引器语法ptr[i]->a 访问元素,但它不起作用。

另一方面,当我使用指针算法(ptr + i)->a 时,它可以工作。

我之所以尝试使用数组方式访问,是因为我认为struct在堆内存中是连续分配的。

我的假设错了吗?

谁能告诉我原因?

#include <stdlib.h>

typedef struct sample_t{
    int a;
} Sample;

void Function(Sample *ptr)
{
    int i;
    Sample *tmp = ptr;
    for(i = 0; i<100; i++)
    { 
        (tmp + i)->a = i; //work!!
    }
    
    for(i = 0; i<100; i++)
    { 
        ptr[i]->a = i;    //doesn't work!!
    }
}

int main(void)
{
    Sample *arr = (Sample *)calloc(100, sizeof(Sample));
    Function(arr);
}

【问题讨论】:

  • 除非我误读了某些内容,否则您需要 ptr[i].a = i;ptr[i]Sample,而不是指向 Sample 的指针。你说“不起作用”,但你没有说它不起作用。
  • "我之所以尝试使用数组方式访问,是因为我认为struct在堆内存中是连续分配的。"是的,但由于结构成员之间的对齐和填充,它不会为您提供最佳性能。不过,这不适用于您的情况。
  • 您能告诉我们“不起作用”是什么意思吗?它崩溃了?

标签: arrays c pointers


【解决方案1】:

我的编译器说:

error: base operand of '->' has non-pointer type 'Sample' {aka 'sample_t'}

我相信你的说法类似。它抱怨这个:

    ptr[i]->a = i;

所以它说ptr[i] 不是指针(-&gt; 需要)。 ptr[i] 不是指针,因为 C 中的 ptr[i] 等价于 *(ptr + i),这意味着对递增指针的取消引用已经发生,所以你需要这个:

    ptr[i].a = i;

【讨论】:

    【解决方案2】:

    数组下标表达式会自动为您取消引用,因此您无需使用-&gt; 来访问成员,而是使用.

    因为ptr[offset]*(ptr + offset) 相同(注意后者需要取消引用*,而不是前者)。

    所以改变这个:

    ptr[i]->a = i;
    

    到这里:

    ptr[i].a = i;
    

    顺便说一句,在 C 中使用动态分配的数组时,您应该始终将数组的长度与数组指针本身保持一致(在 C++ 中,您将为此使用 std::array)。不要忘记使用size_t 作为长度而不是int

    例如

    void Function( size_t n, Sample* arr )
    

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 2012-04-20
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多