分配给指针的结构数组。发生了什么事?

时间:2017-10-25 18:43:22

标签: c arrays pointers struct

编辑: 通过索引pointer[i]访问数组指针中的元素与通过指针增量pointer+1之间的区别。 人们将此问题标记为与此question重复 我很难理解如何?当然,这是一个关于数组和指针的问题,但问题的相似之处到此为止。当然,对C99的引用可能有助于有人深入挖掘C99 ......但是,为什么要使用SO呢? 结束编辑

我有一个结构(说明所有C文件都可以访问它)

typedef struct
{
  uint8_t a;
  uint8_t b;
} task_t;

在一个C文件中(比如Sub.c)我创建了一个这样的结构数组

task_t ossList[10] = {};

在运行时期间进一步填充了ab的值

在同一个C文件(Sub.c)中,我编写了一个函数,使其他C文件能够获得这个结构数组。

void HLP_GetStruct(task_t ** ossListGet) {
    *ossListGet = ossList;
}

我从其他文件(比如Top.c)获取结构的方式是:

    task_t * ossList;
    HLP_GetStruct(&ossList);

    for (k=0; k<nTasks; k++) {
        printf("OssList  %d %d", ossList[k].a, ossList[k].b)
    }

这一切都很好。但是当我仔细观察时,我想知道这是如何工作的。真正发生了什么?

在我的外部C文件(Top.c)中,我将一个指针初始化为相同类型的结构。

task_t * ossList;

然后我将引用传递给另一个C文件(Sub.c)

HLP_GetStruct(&ossList);

并在那个C文件(Sub.c)中我指向“真正的”ossList结构数组,我不知何故得到一个指针数组

void HLP_GetStruct(task_t ** ossListGet) {
        *ossListGet = ossList;
    }

我可以通过

访问索引
for (k=0; k<nTasks; k++) {
            printf("OssList  %d %d", ossList[k].a, ossList[k].b)
        }

如何?

(我之前从未这样做过,我的数组或多或少总是被声明为指针,默认情况下指针指向第一个元素,你可以“复制”指针等...)

Sub.c

task_t ossList[10] = {};
DoSomethingWithStructArray();
void HLP_GetStruct(task_t ** ossListGet) {
    *ossListGet = ossList;
}

Top.c

task_t * ossList;
HLP_GetStruct(&ossList);

for (k=0; k<nTasks; k++) {
  printf("OssList  %d %d", ossList[k].a, ossList[k].b)
}

1 个答案:

答案 0 :(得分:1)

诀窍是访问ossList(如*ossListGet = ossList;中)为您提供仅指向ossList[10]的第一个元素的指针;在Top.c中初始化的指针不会成为一个数组&#34;,但最终指向ossList[0]

由于使用pointer[i]进行数组索引相当于将指针递增i(即pointer+i),因此只需递增指针即可访问ossList[10]的其他元素。到第一个元素(ossList+k),或者理想情况下,使用[]ossList[k])。

相关问题