指向指针数组的指针,指针数组中的每个元素都指向一个链表。

4

我已经花了最近6个小时来解决这个问题,并疯狂地在Google上搜索,但没有任何结果。

我的需求是一个指向数组的指针。该数组包含指向链表的指针。由于我不知道数组大小,所以需要在运行时使用malloc函数分配内存。

LList **array

这是我的第一反应,但这只是给我一个指向LList数组的指针。或者至少这是我的理解。有人能帮帮我吗?
编辑:关于如何使用它的一些信息:我正在实现一个非常基本的哈希表。有一个结构体包含一个指向指针链表的指针数组。 它需要是指向数组的指针,这样当我重新调整表格大小时,我只需改变指针指向更大的表格即可。

最初您说“一个指向包含指向链表的指针的数组”,但是您现在的编辑说“一个指向链表数组的指针”。哪个是正确的? - user470379
不错的发现。重新编辑过了。我想要一个指向链表指针数组的指针。 - Alex
我在下面编辑了我的回复,展示了如何调整大小。这是你新编辑的主要关注点吗?还是你还有其他疑问? - user470379
5个回答

5
听起来你走在了正确的路上。
LList **array;
array = malloc(num_ptrs * sizeof(LList*));

array现在是一个指向LList的指针数组,例如array[3]将成为指向LList的指针。

C语言中,数组和指针非常相似(但不完全相同!),如经典示例所示:*(array + 2)array[2]大致等价。

编辑: 当需要调整表格大小时,只需使用realloc分配额外的空间:

LList **new_array;
new_array = realloc(old_array, new_size * sizeof(LList*));

new_arrayold_array之后可能是同一个指针,但无论如何,new_array都保证是一个足够容纳新数组的空间指针(如果内存无法分配,则为NULL)。

第二次编辑: 正如用户411313所暗示的那样,如果您想要实际的数组指针,则需要获取数组的地址:

LList ***p_array;
p_array = &array;

错误。问题是一个指向指针数组的指针。你的解决方案只是一个指向LList指针的数组。 - user411313

0
一个指向对象的指针,基本上和指向数组的指针是一样的。
int * blah; // an int pointer. It could point to an array of ints, or a single int.
int ** blah; // a pointer to an int pointer. It could point to something that points to an int, or it could be pointing to an array of pointers to single ints, or it could be a pointer that points to an array of ints.

这完全取决于你如何使用它。


0

如果你必须编写自己的链表,你可以这样做。

typedef struct LLNode {
    LLNode* next;
    int     data;
} LLNode;

LLNode* linkedList = null; // a linked list

LLNode**  linkedListArray = (LLNode**) malloc( arraySize* sizeof(LLNode*) );

LLNode*** pointerToLListArray = &linkedListArray;

使用一个链表库:
LList*  linkedListArray = (LList*) malloc( arraySize* sizeof(LList) );

LList** pointerToLListArray = &linkedListArray;

0
typedef struct LList LList;
struct LList {
int value;
LList *next; };

LList *(*p)[3]; /* pointer to an array of 3 pointers to LList */
LList ll1 = {11};
LList ll2 = {22};
LList ll3 = {33};
size_t sizeofarray = sizeof*p/sizeof**p; /* calc arraysize at runtime here */
p = malloc( sizeofarray * sizeof**p ); /* allocate space for each LList-pointer in array */
(*p)[0] = &ll1;
(*p)[1] = &ll2;
(*p)[2] = &ll3;
/* test output here: */
printf("\n%d\n%d\n%d", ((*p)[0])->value,((*p)[1])->value,((*p)[2])->value);
free(p);

0
一个指向指针的指针也可以是指针数组。

int nLists; /* number of lists*/
LList **array;
array = (LList **)malloc(nLists * sizeof(LList *));

array 变为指向 LList 的指针数组。然后 array [i] 将给你指向数组中第i个链表的指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接