C语法问题

时间:2010-08-16 14:12:24

标签: c

你好我在c中返回一个链接列表数组有问题 让我说我得到了

arrlinklist = {linklist1 , linklist 2...,linklist5}

我希望我的函数返回arrlinklist。 我怎么做...提前thx。


我想知道如何定义我的函数的签名 我试过了 linkedlist * CreateArrayOfList();

4 个答案:

答案 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时,函数实际接收的是指针类型,而不是数组类型。由于指针不知道它们指向的区域的大小,因此您必须将数组大小作为单独的参数传递。