gpt4 book ai didi

C结构指向结构数组的指针,来自结构

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:27 24 4
gpt4 key购买 nike

我需要一些关于指针语法的帮助。我有一个结构数组,我正在尝试从数组中包含的另一个结构内部创建一个指向它的指针。

struct foo array* = malloc(sizeof(foo)*10);
bar_arr[i]->foo_ptr = &array;

我已经通读了这个问题:c pointer to array of structs .虽然它确实消除了一些困惑,但我仍然有一些错误需要解决。

我这样定义我的结构:

struct bar{
...
struct foo (*foo_ptr)[];
...
}

看来我可以向数组中添加新结构,因为以下不会返回任何错误:

(*bar_arr[i]->foo_ptr)[j] = new_struct;

但是,如果我尝试创建一个指向结构数组内部结构的新指针,如下所示:

struct foo* one_ptr = (*bar_arr[i]->foo_ptr)[j];

或者这个:

struct foo* one_ptr = bar_arr[i]->foo_ptr[j];

编译器会给我错误。要么是无效使用具有未指定边界的数组,要么是 one_ptr 和 foo_ptr[j] 具有不兼容的类型(在这种情况下:一个是 foo 类型,另一个是 struct foo *)。

是否根本不可能创建指向结构数组元素之一的指针?任何帮助将不胜感激。

编辑:更好的代码示例

我目前正在使用线性链表作为共享内存堆栈,用于 pthreads。结构数组是一个共享的节点池。每当从堆栈中删除一个节点时,它就会被放入共享池中。如果线程尝试向堆栈添加新项目,它会检查要添加的元素是否存在于池中,以避免每次需要向堆栈添加另一个元素时都必须分配新内存。

每个线程都需要一个指向共享节点池的指针作为参数。这就是为什么我试图从参数结构中创建一个指向它的指针。我希望这个问题有一个简单的答案。

typedef struct node{...} node_t;

struct thread_args
{
...
node_t (*pool)[];
...
}

node_t shared_pool = malloc(sizeof(node_t)*10);
arg[index]->pool = &shared_pool;

我正在尝试访问线程正在执行的函数之一中的池。

node_t *item;
item = stack->root;
//remove item from stack
(*args->pool)[index] = item;
//...later
node_t *item2;
item2 = (*args->pool)[index];

希望这能提供更多信息。

此外,我在尝试使用时遇到的确切错误:

node_t *pool;
args[index]->pool = shared_pool;

如下:error: incompatible types when assigning to type ‘struct node_t *’ from type ‘node_t’。

最佳答案

对于初学者这个声明(没有提到右大括号后省略的分号)

struct bar{
...
struct foo (*foo_ptr)[];
^^^
...
}

无效。您必须指定数组的大小。否则指针将指向一个不完整类型的对象。

考虑到您尝试使用数组的方式,此声明没有意义。您可以像这样声明数据成员

struct bar{
...
struct foo *foo_ptr;
...
};

然后

struct foo *array = malloc(sizeof(struct foo)*10);
bar_arr[i]->foo_ptr = array;

在这种情况下你可以这样写

bar_arr[i]->foo_ptr[j] = new_struct;

struct foo* one_ptr = bar_arr[i]->foo_ptr + j;

struct foo* one_ptr = &bar_arr[i]->foo_ptr[j];

关于C结构指向结构数组的指针,来自结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47758987/

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