你好我在c中返回一个链接列表数组有问题 让我说我得到了
arrlinklist = {linklist1 , linklist 2...,linklist5}
我希望我的函数返回arrlinklist。 我怎么做...提前thx。
我想知道如何定义我的函数的签名 我试过了 linkedlist * CreateArrayOfList();
答案 0 :(得分:3)
在C中你不能返回数组,你只能返回一个指向数组第一个元素的指针。
答案 1 :(得分:1)
也许您可以维护链接列表的链接列表。我假设您已成功创建链接列表。
答案 2 :(得分:0)
我假设你想要这样的东西: (没有检查这个程序,你应该检查malloc故障等')
#include <stdio.h>
#include <stdlib.h>
typedef struct list1
{
struct list1 *next;
int data;
} list;
list **
getArrayLists(int amount)
{
list** arrayList = malloc(sizeof(list[amount]));
int i=0;
for (i=0;i<amount;++i)
{
list *listPointer = malloc(sizeof(list));
//let's start their data portion to be the index
listPointer->data = i;
arrayList[i] = listPointer;
}
return arrayList;
}
int
main()
{
list** arrayList = getArrayLists(10);
int i=0;
for(i=0;i<10;++i)
printf("%d\n",arrayList[i]->data);
}
答案 3 :(得分:0)
几点:
首先,C函数不能返回数组类型;然而,他们可以将指针返回到数组:
T (*foo())[N] {...} // returns pointer to N-element array of type T
签名分解为:
foo -- foo
foo() -- is a function
*foo() -- returning a pointer
(*foo())[N] -- to an N-element array
T (*foo())[N] -- of T
指向数组的指针不方便使用;你(通常)必须知道你正在处理的数组类型的大小(指向int的10元素数组的指针是一个不同的,不兼容的类型,指向一个11元素的int数组),你在应用下标((*arr)[i] = ...)
之前必须取消引用数组标识符。其次,你不能只从函数中返回数组的地址,如
int (*foo())[10]
{
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
return &arr; // THIS DOESN'T WORK!!!!!!!!
}
因为一旦函数退出arr
在技术上不再存在,并且调用者接收的值现在指向可能被覆盖或不再可用的内存。
通常的习惯用法是让函数动态分配你想要的类型的一块内存,初始化它,然后返回一个指向那个基类型的指针:
T *foo(size_t count) // you may pass other arguments if necessary for
// for initializing the buffer
{
T *bar = malloc(sizeof *bar * count);
if (bar)
{
// initialize the contents of bar
}
return bar;
}
int main(void)
{
T *blah = foo(10);
if (blah)
{
int i;
for (i = 0; i < 10; i++)
do_something_with(blah[i]);
}
return 0;
}
将上面的T替换为您的链接列表类型,这应该为您提供您想要做的基础。
如果您不想搞乱动态内存(避免内存管理问题的最佳方法是避免内存管理),您可以将目标数组作为参数传递给函数,如下所示:
void foo(T *bar, size_t count) // along with any other parameters necessary
// to initialize bar
{
size_t i;
for (i = 0; i < count; i++)
do_something_with(bar[i]);
}
int main(void)
{
T blah[10];
foo(blah, sizeof blah / sizeof blah[0]);
...
}
请记住,在大多数情况下,数组表达式的类型将从“T(T [N]
)的N元素数组”隐式转换(“衰减”)到“指向T的指针(T *
)“,所以当你用数组参数调用foo
时,函数实际接收的是指针类型,而不是数组类型。由于指针不知道它们指向的区域的大小,因此您必须将数组大小作为单独的参数传递。