gpt4 book ai didi

c - 如何为任意长度的结构数组分配内存并指向它?

转载 作者:行者123 更新时间:2023-11-30 17:22:02 26 4
gpt4 key购买 nike

struct foo{
member
member
}array[]

struct bar{
member
member
struct foo* p
}

array = malloc(10 * sizeof(struct foo))
p = &array[0]

我想为 struct foo 数组应保存的任意数字分配内存。我怎么做?我还希望 struct foo* p 指向 struct foo 数组。我做错了,但我不知道如何思考这个问题。

如果我无法以这种方式分配结构数组,那么我应该怎么做?

最佳答案

如果我理解你的意思,你想要创建一个包含 foo 类型元素的数组。以下代码执行此操作:

    (001)    int   number = 10, ndx;
(002)
(003) typedef struct _foo
(004) {
(005) int member1;
(006) int member2;
(007) } foo, *pfoo;
(008)
(009) pfoo ptr = malloc(number * sizeof(foo));

那么这是怎么回事呢?第 3 行到第 7 行定义了您的新类型(该结构,我刚刚包含了两个整数以使其具体化)。此外,typedef(记住 typedef 的语法是 typedef old_type_name type_alias )部分为您的结构添加了两个别名。

 foo is equivalent to struct _foo 
pfoo is equivalent to struct _foo*

第 9 行现在在堆上分配一 block 足够大的内存块来容纳 number struct _foo (or foo for short) 的副本。

那么你将如何在代码中使用它。以下代码将数组索引存储在第一个成员中,并将索引的平方存储在第二个成员中。

   (010)    for(ndx = 0; ndx < number; ndx++)
(011) {
(012) ptr[ndx].member1 = ndx;
(013) ptr[ndx].member2 = ndx*ndx;
(014) }

所以,这可能有点难以理解,所以这里是重要的需要记住的要点;

  1. ptr 是一个指向足以容纳 number 的内存块的指针。 foo 类型的元素。
  2. 数组索引符号,即ptr[],实际上是指针算术的语法糖。例如ptr[3]相当于 ptr + 3*sizeof(foo) 。换句话说,我们能够在第 1 点创建的大内存块中从一个子 block 移动到另一个子 block 。
  3. 第 2 点中的算术产生一个匿名临时变量,该变量引用特定的子 block (我们知道它是一个结构)。因为我们告诉编译器每个 block 都是一个结构,所以我们可以使用成员引用 (.) 来获取各个字段。

因此,将所有这些放在一个简短的程序中会产生:

    #include <stdio.h>
#include <stdlib.h>

typedef struct _foo
{
int member1;
int member2;
} foo, *pfoo;

int main(int argc, char** argv)
{
int number = 10, ndx;

pfoo ptr = malloc(number * sizeof(foo));
for(ndx = 0; ndx < number; ndx++)
{
ptr[ndx].member1 = ndx;
ptr[ndx].member2 = ndx*ndx;
}

for(ndx = 0; ndx < number; ndx++)
{
foo temp = ptr[ndx];
printf("%d\t%d\n", temp.member1, temp.member2);
}

return 0;
}

在我的系统(Ubuntu Linux)上,可以使用以下命令行进行干净的编译: gcc -ansi -Wall -pedanic temp.c -o temp

<小时/>

[编辑] - 忘记回答问题的第二部分。

通过上述内容,你的第二个问题的答案现在应该相当明显了(我希望)。

好的,现在您要使用的两个结构是:

    typedef struct _foo
{
int member1;
int member2;
} foo, *pfoo;

typedef struct _bar
{
int member1;
int member2;
pfoo p; /* or alternatively, struct _foo* p */
/* or alternatively, foo* p */
} bar, *pbar;

此时,您可以在代码中编写:

    bar      temp;

temp.member1 = 5;
temp.member2 = 10;
temp.p = malloc(number*sizeof(foo));

希望这有帮助,

关于c - 如何为任意长度的结构数组分配内存并指向它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28132862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com