C和动态结构元素访问

C和动态结构元素访问,c,pointers,struct,element,structure,C,Pointers,Struct,Element,Structure,我有一个复杂的结构: #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)); examp

我有一个复杂的结构:

#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;
}

当指针指向指针时,通常会遇到优先级问题。我记不起这是否是一个,但您可以尝试
(示例->b)[I].x

尝试以下方法:

int my_x = example[3].z[2].x;
  • 上面的代码将首先访问示例[3](示例数组的第四个元素)
  • 一旦您获得了那个特定的元素,它的内容就可以像您使用普通对象一样被自动访问
  • 然后从该元素访问z[2]。请注意,
    示例[3]
    是一个元素,因此可以使用
    访问其成员;如果它是一个数组,则可以作为数组访问它
  • 因此,到目前为止,
    示例[3].z[2]
    子数组的一个元素,在
    示例
    数组的一个元素中
  • 现在,您可以使用上面显示的方式访问成员
    x

类型定义结构{
int x;
int-y;
}亚单位;
类型定义结构{
INTA;
SUB*z;
}结构;
结构*示例;
int main(){
示例=malloc(sizeof(STRUCT)*10);//10的数组;
int i=0,j=0;

对于(;i您的问题不是您所说的问题所在。您发布的代码给出了一个编译错误:

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
*/
/*您在此处的声明*/
示例=malloc(sizeof(STRUCT));
示例->z=malloc(NUM*sizeof(SUB));
对于(i=0;iz[i].x=i;
示例->z[i].y=-i;
printf(“%d%d\n”,示例->z[i].x,示例->z[i].y);
}
/*输出:
0 0
1 -1
2 -2
3 -3
4 -4
*/

首先,您的第二个
malloc
是错误的;
示例
是一个指针,因此:

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>
#包括

在“破旧的解决办法”中,您写道:

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);
}
当然,正如其他人所说,您也可以这样做(假设C99):

for(int i=0;iz[i].x=示例->z[i].y=0;
#包括
#包括
#包括
#定义NUM 5
类型定义结构
{
int x;
int-y;
}亚单位;
类型定义结构
{
INTA;
SUB*z;
}结构;
真空总管(真空)
{
clrsc();
printf(“示例问题..\n\n”);
结构*示例;
int i;
示例=(STRUCT*)malloc(sizeof(STRUCT));
示例->z=(SUB*)malloc(NUM*sizeof(SUB));
对于(i=0;iz[i].x=i+1;
示例->z[i].y=(示例->z[i].x)+1;
printf(“i=%d:x:%d y:%d\n”,i,example->z[i].x,example->z[i].y);
}
}

我在你的代码中没有看到任何
z
。你能解释一下吗?真是一团糟。XrM,请清理
z
b
。其他人已经把它们弄乱了,然后也删除了他的答案。调试后,看起来较短的版本只增加了8个字节,而不是正确的64个字节。我想你还没有告诉我们如果你为
example
example->z
分配了适当的内存,那么
example->z[i].x
是一个完全有效的表达式。与
example->z[i]相同.x
。注意:
b
改为
z
。这不是一个特别有用的答案。如果一切都安排好了,那么
example->z[2]。x
也会起作用,与
example[0]相同。z[2]。x
。我从来没有否认过你说的话。他在语法上没有错。只是在逻辑上。:-)@这个逻辑也不一定有什么问题。指针并不总是指向数组——它们也可能是单个对象。我也没有否认这一点。我不明白你的意思。请解释一下。我的意思是,你的大部分答案都是建议OP以数组的形式访问这个变量,而实际上它不是。它不是不管真正的问题是什么。是的,我的错误,我在示例中写错了。我的实际程序即使启用了-Wall选项也没有给出任何编译错误。valgrind也给了我一个清晰的答案。@Xrm:我的程序给出了我期望的输出。我不知道你的问题是什么-它不在这里。我用我的窗口编译了它s Dev-C++IDE和它的打印垃圾。当我用
GCC4.4
在我的unix机器上编译相同的代码时,它工作正常。是否可能是与Dev-C++捆绑的旧GCC版本以某种方式被破坏了。@XrM:这…很有趣。这段代码太基本了,我很难看出哪里会出错。请检查
示例的值de>和
example->z
-如果
malloc
以某种方式失败,它们应该是
NULL
。在实际代码中进行了错误检查。没有问题。我必须承认,我的笔记本电脑上安装了非常旧的Dev-C++版本。这也可能是某种libc实现错误。我使用GCC 4.x和其他工具更新了code::Blocksing很好。已经修复了
->
->
.2。我知道需要
stdlib.h
#include <stdlib.h>
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);
}
SUB *ptr = example->z;
int i;

for (i = 0; i < NUM; ++i) {
    ptr->x = ptr->y = 0;
    ptr++;
}
for (int i = 0; i < NUM; ++i)
    example->z[i].x = example->z[i].y = 0;