我有这种复杂的结构:
#include <stdlib.h>
typedef struct {
int x;
int y;
} SUB;
typedef struct {
int a;
SUB *z;
} STRUCT;
#define NUM 5
int main(void)
{
STRUCT *example;
int i;
example = malloc(sizeof(STRUCT));
example->z = malloc(NUM * sizeof(SUB));
for(i = 0; i < NUM; ++i) {
/* how do I access variable in certain struct of array of z's */
}
return 0;
}
example
是动态分配的结构,z
内的example
是动态分配的SUB
结构数组。
如何访问结构z
的某个元素中的某个变量?
我一直在尝试这样的事情: example->z[i].x
但它似乎无法正常工作。
目前我正在使用这个看起来很破旧的工作区:
SUB *ptr = example->z;
int i;
for(i = 0; i < amount_of_z_structs; ++i) {
/* do something with 'ptr->x' and 'ptr->y' */
ptr += sizeof(SUB);
}
答案 0 :(得分:1)
你的问题不在你说的地方。您发布的代码会产生编译错误:
error: request for member ‘z’ in something not a structure or union
在
行example.z = malloc(sizeof(STRUCT));
因为您打算写example->z
,因为example
是指向STRUCT
的指针,而不是STRUCT
。
从那时起,您可以完全按照说法访问example->z[i].x
。这种语法一直很好。
例如:
/* your declarations here */
example = malloc(sizeof(STRUCT));
example->z = malloc(NUM * sizeof(SUB));
for(i = 0; i < NUM; ++i) {
example->z[i].x = i;
example->z[i].y = -i;
printf("%d %d\n", example->z[i].x, example->z[i].y);
}
/* output:
0 0
1 -1
2 -2
3 -3
4 -4
*/
答案 1 :(得分:0)
当你有指向指针的指针时,你经常会遇到优先问题。我不记得这是否是一个,但您可以尝试(example->b)[i].x
。
答案 2 :(得分:0)
试试这个:
int my_x = example[3].z[2].x;
example[3]
是一个元素,因此您可以使用.
来访问其成员;如果它是一个数组,你可以作为数组访问它。example[3].z[2]
是{strong>一个元素,位于example
数组的一个元素内。x
即可。
typedef struct {
int x;
int y;
} SUB;
typedef struct {
int a;
SUB *z;
} STRUCT;
STRUCT *example;
int main() {
example = malloc(sizeof(STRUCT)*10); //array of 10;
int i=0,j=0;
for (;i<10;i++){
example[i].a = i;
example[i].z = malloc(sizeof(SUB)*5);
for (j=0; j<5; j++)
example[i].z[j].x = example[i].z[j].y = j;
}
//access example[3] and access z[2] inside it. And finally access 'x'
int my_x = example[3].z[2].x;
printf("%d",my_x);
for (i=0;i<10;i++){
printf("%d |\n",example[i].a);
//example[i].z = malloc(sizeof(SUB)*5);
for (j=0; j<5; j++)
printf("%d %d\n",example[i].z[j].x,example[i].z[j].y);
free(example[i].z);
}
free(example);
}
答案 3 :(得分:0)
首先,你的第二个malloc
是错误的; example
是一个指针,所以:
example.z = malloc(NUM * sizeof(SUB));
应该是这样的:
example->z = malloc(NUM * sizeof(SUB));
然后在你的循环中你可以这样说:
example->z[i].x = i;
example->z[i].y = i;
您还希望将此文件放在文件的顶部:
#include <stdlib.h>
答案 4 :(得分:0)
在'破旧的解决方法'中,您写道:
SUB *ptr = example->z;
int i;
for(i = 0; i < amount_of_z_structs; ++i) {
/* do something with 'ptr->x' and 'ptr->y' */
ptr += sizeof(SUB);
}
这里的问题是C根据指向的对象的大小来缩放指针,因此当您向SUB
指针添加1时,该值会提前sizeof(SUB)
。所以,你只需要:
SUB *ptr = example->z;
int i;
for (i = 0; i < NUM; ++i) {
ptr->x = ptr->y = 0;
ptr++;
}
当然,正如其他人所说,你也可以这样做(假设C99):
for (int i = 0; i < NUM; ++i)
example->z[i].x = example->z[i].y = 0;
答案 5 :(得分:0)
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define NUM 5
typedef struct
{
int x;
int y;
}SUB;
typedef struct
{
int a;
SUB* z;
}STRUCT;
void main(void)
{
clrscr();
printf("Sample problem..\n\n");
STRUCT* example;
int i;
example = (STRUCT*)malloc(sizeof(STRUCT));
example->z = (SUB*)malloc(NUM * sizeof(SUB));
for(i = 0; i < NUM; i++)
{
example->z[i].x = i +1;
example->z[i].y = (example->z[i].x)+1;
printf("i = %d: x:%d y:%d\n", i, example->z[i].x, example->z[i].y);
}
}