【问题标题】:Can I use two arrays of pointers to struct, pointing to the same struct?我可以使用两个指向结构的指针数组,指向同一个结构吗?
【发布时间】:2020-12-12 22:37:45
【问题描述】:

我在使用指针和结构方面迈出了第一步,我正在为我的学校做这项工作,告诉我根据标题对指向结构的指针数组进行排序。一切准备就绪,我想问我是否可以执行此代码。

typedef struct book {
    char title[MAX_TITLE];
    char isbn[MAX_ISBN];
    char authors[MAX_AUTHORS];
    char publisher[MAX_PUB_NAME];
} Book;

int main(int argc, char **argv)
{
if(argc < 2)
    {
        printf("error. insert a file or a valid one when compiling\n");
        return 0;
    }
    
    FILE* src = fopen(argv[1], "r");
    
    if(src == NULL)
    {
        printf("\nERROR.Insert valid file or file name\n");
        return 0;
    }
    
    Book lista_T[MAX_BOOKS];
    Book lista_I[MAX_BOOKS];
    
    int bookCount = loadList(lista_T,MAX_BOOKS,src);
    int bookCount = loadList(lista_I,MAX_BOOKS,src);

他们告诉我,我必须创建另一个指向该结构的指针列表数组,这次按数组 isbn 对其进行排序,该数组包含特定于每本书的代码,但不会更改我为 lista_T 所做的按标题排序。

我最初以为我可以直接进入并使用相同的参数创建一个数组 lista_I 并通过数组 isbn 对它进行排序,而不涉及按标题排序的另一个数组。但是当我去编译它并尝试打印在 struct lista_T 和 lista_I 的两个数组上排序的所有信息时,我意识到 Lista_T 正确打印了所有内容,但 lista_I 没有打印任何内容,就像那里什么都没有一样。为什么会这样。 抱歉,如果我在这里犯了一些明显的错误,但正如我所说,这是我第一次使用指针和相关的东西。

请告诉我,您是否需要查看我没有放在这里以便进一步提供帮助的部分代码。

附:这项工作中的老师特别告诉不要使用 malloc 或其他类似的东西,而只是预先分配过大的内存分配,以便在一开始对我来说更简单。

【问题讨论】:

  • "to order this array of pointers" 在继续第二部分之前,您应该首先开始使用指针数组来解决任务的第一部分。

标签: arrays c struct


【解决方案1】:

根据您对行为的描述,我推断该功能 loadList 只是从输入文件中的任何位置开始读取 由src指示,并一直读取数据,直到达到停止条件 某种(可能已经读取了MAX_BOOKS 书籍的数据,可能到达了文件的末尾,可能是其中任何一个,以先到者为准)。 在它停止阅读之后,它就停止对src 做任何事情。

所以当第二次调用函数loadList时,src指向的文件访问器位于第一次调用读取的最后一个数据的末尾之后, 在那之后就没有更多的书了。 所以没有数据可以从文件中读取,也没有任何数据可以放入数组中。

没有理由从文件中读取数据两次。您可以使用访问文件的src 第一次读取数据,但是当您需要第二个数组时,您应该只查看已经从文件中读取的数据。 你根本不应该引用src

(从技术上讲,你可以倒回文件,然后你就可以重新读取数据,但是读取文件相对昂贵——为什么要连续读取同一个文件两次?)

顺便说一句,在问题的代码中,您没有任何指向结构的指针数组。你有两个结构数组。 指向结构的指针数组看起来像这样:

    Book* lista_I[MAX_BOOKS];

【讨论】:

  • 抱歉搞砸了,它们实际上是结构数组而不是指针数组。你在那个指向我文本结尾的 src 上非常正确。正如你所说,我不必再次从文件中读取,我只是使用函数 memcpy 从一个复制到另一个,只需要传递 lista_T 的大小(使用 sizeof),然后从那里我对我的数组 lista_I 进行排序从 isbn 开始,最后我能够应用 bsearch 函数(这就是我必须对数组进行排序的原因)。再次非常感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多