【问题标题】:How to use struct array in a function as a parameter in C?如何在函数中使用结构数组作为C中的参数?
【发布时间】:2021-03-17 01:08:00
【问题描述】:

我正在尝试用链表节点填充数组。但我遇到了一些错误。

  • 列表结构
  • fillArray 方法
struct List
{
    char frequency[STRING_LEN];
    char word[STRING_LEN];
    char lineOrder[STRING_LEN];
    struct List *next;
};

void fillArray(struct List *nodesArr[50]){
     int a=0;
    struct List *ptr = head;  // head is my first node for linkedlist. I have created this earlier.
    
    while(ptr->next!=NULL){
        
        *nodesArr[a]->frequency=ptr->frequency; // I get error here
        *nodesArr[a]->word=ptr->word; //  and here  *assignment to 'char' from 'char *' makes integer from* //*pointer without a cast*

        ptr=ptr->next;
        a++;


    }
}

*assignment to 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]gcc* error
[error][1]
[error2][1]


我也在 main func 中声明 nodesArr,如下所示:

struct List *nodesArr[length()];

我这样调用fillArray方法:

 fillArray(*nodesArr); // How should I put an array as a parameter?

我不知道如何在函数中使用 struct array 作为参数,以及如何避免转换错误。 任何帮助,将不胜感激 提前致谢

编辑 我已经将这样的 fillArray 方法转换为更清晰。

void fillArray(struct List **nodesArr){
     int a=0;
    struct List *ptr = head;
    
    while(ptr->next!=NULL){
       
        
        strcpy(nodesArr[a]->frequency,ptr->frequency);
        strcpy(nodesArr[a]->word,ptr->word);

        ptr=ptr->next;
        a++;


    }
}

编辑2 head 是全局定义的

struct List *head = NULL;

我用这种方法填充头部链表:

void insertFirst(char *data, char *frequency, char *lineOrder)
{
    struct List *link = (struct List *)malloc(sizeof(struct List));
    strcpy(link->word, data); // To copy the elements of data to new node's word
    strcpy(link->frequency, frequency);
    strcpy(link->lineOrder, lineOrder);
    link->next = head;
    head = link;
}

【问题讨论】:

  • 请用确切的错误更新问题。
  • struct List *nodesArr[50] 是一个由 50 个 指针 指向 struct List 的数组
  • 从 'char *' 对 'char' 的 1-assignment 从指针生成整数而无需强制转换 [-Wint-conversion]gcc 2-从不兼容的指针类型传递 'printArray' 的参数 1
  • char frequency[STRING_LEN];char word[STRING_LEN];数组,不能是左值。你的类型看起来完全错误,因为你解释了你想要完成的事情。如果您只想要一个结构数组,请参阅C Source #2 Example on Godbolt,否则请提供A Minimal, Complete, and Verifiable Example (MCVE)
  • 感谢您的更新,但它不是 MCVE。例如,struct List *ptr = head; 中的head 是什么,以及在您第一次调用fillArray() 之前它是如何声明和初始化的?如果它被初始化NULL,你将在ptr=ptr->next;进行SegFault

标签: arrays c parameters casting linked-list


【解决方案1】:

您遇到的困惑是由于数组不是 C 中的一流类型,并且您无法使用它们做很多事情。特别是:

  • 您不能将函数参数声明为数组。如果你这样做了,编译器会默默地把它变成一个没有警告或错误的指针。对于刚接触 C 的程序员来说,这是一个常见的混淆来源。在您的情况下,当您声明 fillArray(struct List *nodesArr[50]) 时,就好像您声明了 fillArray(struct List **nodesArr)
  • 您不能将数组作为参数传递。如果这样做,它将被静默地转换为指向数组第一个(第 0 个)元素的指针。

现在上面的静默转换可能看起来很奇怪,但它们通常会奏效,因为数组索引在后台被静默转换为指针运算,所以就大多数用途而言,您使用指向数组第一个元素的指针与您使用数组的方式相同。所以在函数中,你可以使用双指针,就好像它是一个指针数组一样,事情就会解决。唯一美中不足的是sizeof 不能正常工作——它给出的是指针的大小而不是数组的大小。

【讨论】:

  • 它和你说的完全一样,它指向第 0 个元素,仅此而已。所以我认为,我需要在不使用它作为参数的情况下找到一个用节点填充数组的方法。我错了吗?谢谢
猜你喜欢
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多