从C中的链表返回一个字符串数组

时间:2014-02-18 12:41:26

标签: c pointers multidimensional-array linked-list

我目前正在实现一个链表,它将在每个节点中存储一个字符串数组。目前我正在尝试将这些字符串数组返回给main。结构代码是

#define MAX_LINE 80

typedef struct node 
{
    char things[MAX_LINE/2][MAX_LINE];
    struct node *link;
}Node;

并且问题的方法是

char **getThings(Node *head, int position){
    if(position == 1){
        return head->things;
    }
    int i = 1;
    while(head->link != NULL){
        head = head->link;
        i++;
        if(i == position){
            return head->things;
        }
    }

{

然而,错误是一个“警告:从不兼容的指针类型返回。我已经查看了在C和动态分配中返回的数组但是无法理解它与链表访问有关。如果每个元素都在事情被取出并放入一个动态分配的数组中,如果是这样的话?

3 个答案:

答案 0 :(得分:1)

您应该从getThings

返回正确的类型

#define MAX_LINE 80

typedef char (*thing_t)[MAX_LINE];

thing_t getThings(Node *head, int position){
    if(position == 1){
        return head->things;
    }
    int i = 1;
    while(head->link != NULL){
        head = head->link;
        i++;
        if(i == position){
            return head->things;
        }
    }

答案 1 :(得分:1)

指针和数组是不同的类型。在某些情况下,数组求值为指向其第一个元素的指针。这并不意味着数组和指针是相同的。它们具有不同的指针算法和不同的sizeof值。

things中的{p> struct node类型为array of 80 char[80]类型char[80]类型为array of 80 int类型。函数getThings返回char **类型的值,该值与int **类型不同且不兼容。

从函数返回数组时,实际上会返回指向数组第一个元素的指针。因此head->things评估为键入pointer to int[MAX_LINE]。在返回此值之前,您通过隐式类型转换更改其类型,因为它与函数的返回类型不匹配。 (因此警告)。

// in getThings 

return head->things 

所以基本上它等同于基本上这样做

return (int **)head->things;

我已经详细地写了here为什么int **int *[MAX_LINE]是不兼容的类型,并且将后者类型转换为前一种类型是完全错误的。明确的类型转换无济于事。它只会抑制更糟糕的警告。

使这项工作的唯一方法是将您的功能签名更改为:

typedef char (*arr_ptr)[MAX_LINE];
arr_ptr getThings(Node *head, int position);

答案 2 :(得分:0)

char (*getThings(Node *head, int position))[MAX_LINE]{
...

char (*p)[MAX_LINE];
p=getThings(&head, 1);