指向包含指针的结构的指针

时间:2015-06-06 22:12:55

标签: c arrays pointers struct

假设我有一个结构(数据类型),如下所示:

typedef struct {
    int size;
    int *p;
} mystruct;

我将一个新结构声明为指针,因为我想通过引用将其传递给其他函数:

mystruct *hello;

我有三个问题:

  1. 我了解要访问size变量,我必须使用hello->size(*hello).size,并且如果我通过p hello->p p 1}}我只会访问(hello->p)[2]数组的第一个位置。但是......如何在该数组中使用一个元素?是正确的realloc

  2. 我是否可以p数组使用相同的符号(hello->p)进行hello

  3. 如果我通过引用传递hello->size = 3并希望修改其变量和数组的内容......是否足以让p使更改生效整个计划?如何引用数组-UTF8String的元素?

  4. 我很欣赏这件事的任何暗示!

3 个答案:

答案 0 :(得分:3)

修改

你编辑了你的问题,现在p是一个指针,而不是一个数组。

  1. 是的,你可以省略括号。
  2. 是的,但在调用malloc之前,您必须先调用realloc为其分配内存。

    修改

    或者您可以将hello->p初始化为NULL,以便调用realloc(hello->p, someSize)将返回与malloc(someSize)相同的值。

    无论如何,如果realloc(hello->p, someSize)未初始化,请不要致电hello->p

  3. 嗯,它只会影响hello引用的对象的size成员。如果您更改size成员,则可能还需要realloc hello ->p,以使其与hello->size的大小相匹配。您可以使用hello->p[index]访问p的元素。您可以使用&hello->p[index]获取一个元素的地址。

  4. 编辑2

    在这里回答你的评论。

    如果您在评论(mystructure hello[N];)时声明了一个mystructure数组,则可以使用hello[index].sizehello[index].p以及hello[index1].p[index2]来访问它。 这是因为hello[index]是一个结构;

    要使用语法hello[index1]->p[index2](相当于(*(hello[index1])).p[index2]),必须向mystructure:mystructure * hello[N]声明一个指针数组,但是必须分配每个N指针的内存:

    for (size_t i=0; i<N; ++i) {
        hello[i] = malloc(sizeof(mystructure));
        /* todo: initialize hello[i]->size and hello[i]->p */
    }
    

    原始答案

    您的结构定义将无法编译,因为在表达式int p[size]中,必须在编译时知道大小。它不能是int size成员,因为它是一个变量。如果您将int size声明为const并为其指定值,则可以。

    1. 是的,你可以省略括号
    2. 你不能realloc p,因为你没有调用malloc来为它分配内存。
    3. 不,因为我先说了你的结构。

答案 1 :(得分:0)

  1. 是的,如果hello是指针,您可以访问p数组:(hello->p)[2]
  2. 您将无法realloc您的p阵列。 p是一个静态数组(由于使用[size]声明)。如果您希望能够重新分配它,则需要将其声明为int *p
  3. 只要它已经是指向结构的指针,就不必将hello作为引用传递。如果你修改它,结构将在任何地方修改。

答案 2 :(得分:0)

  1. 是的,(hello->p)[2]甚至只有hello->p[2]才能访问p的元素。

  2. 您不能realloc静态分配数组,只能动态分配数组。 如果您希望能够realloc p,则必须将p更改为指向整数的指针:

    typedef struct {
        int size;
        int *p;
    } mystruct;
    
  3. 是。请记住,使用指向结构的指针直接访问包含结构的内存。您对结构元素所做的任何更改都将反映到应用程序中引用该内存位置的所有位置。

相关问题