假设我有一个结构(数据类型),如下所示:
typedef struct {
int size;
int *p;
} mystruct;
我将一个新结构声明为指针,因为我想通过引用将其传递给其他函数:
mystruct *hello;
我有三个问题:
我了解要访问size
变量,我必须使用hello->size
或(*hello).size
,并且如果我通过p
hello->p
p
1}}我只会访问(hello->p)[2]
数组的第一个位置。但是......如何在该数组中使用一个元素?是正确的realloc
?
我是否可以p
数组使用相同的符号(hello->p
)进行hello
?
如果我通过引用传递hello->size = 3
并希望修改其变量和数组的内容......是否足以让p
使更改生效整个计划?如何引用数组-UTF8String
的元素?
我很欣赏这件事的任何暗示!
答案 0 :(得分:3)
你编辑了你的问题,现在p是一个指针,而不是一个数组。
是的,但在调用malloc
之前,您必须先调用realloc
为其分配内存。
修改的
或者您可以将hello->p
初始化为NULL
,以便调用realloc(hello->p, someSize)
将返回与malloc(someSize)
相同的值。
无论如何,如果realloc(hello->p, someSize)
未初始化,请不要致电hello->p
。
嗯,它只会影响hello引用的对象的size
成员。如果您更改size
成员,则可能还需要realloc
hello ->p
,以使其与hello->size
的大小相匹配。您可以使用hello->p[index]
访问p的元素。您可以使用&hello->p[index]
获取一个元素的地址。
在这里回答你的评论。
如果您在评论(mystructure hello[N];
)时声明了一个mystructure数组,则可以使用hello[index].size
和hello[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
并为其指定值,则可以。
realloc
p,因为你没有调用malloc
来为它分配内存。答案 1 :(得分:0)
hello
是指针,您可以访问p
数组:(hello->p)[2]
。realloc
您的p阵列。 p
是一个静态数组(由于使用[size]声明)。如果您希望能够重新分配它,则需要将其声明为int *p
。hello
作为引用传递。如果你修改它,结构将在任何地方修改。答案 2 :(得分:0)
是的,(hello->p)[2]
甚至只有hello->p[2]
才能访问p的元素。
您不能realloc
静态分配数组,只能动态分配数组。
如果您希望能够realloc
p
,则必须将p
更改为指向整数的指针:
typedef struct {
int size;
int *p;
} mystruct;
是。请记住,使用指向结构的指针直接访问包含结构的内存。您对结构元素所做的任何更改都将反映到应用程序中引用该内存位置的所有位置。