漫漫长路。自渡 2021-03-24 21:02 采纳率: 0%
浏览 6

为什么数组第一个值会改变?不解 图内代码为读取文件的数据并存到指针数组里,每一个指针对应一个要求的数

为什么数组第一个值会改变?不解 图内代码为读取文件的数据并存到指针数组里,每一个指针对应一个要求的数据。但是很奇怪的是,每次进行完一次(即指针数组里的i加1),之后指针数组的第一位却会变化,但我并没有初始化i为0。
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-23 22:32
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题是由于程序中使用了mallocfree函数导致的。malloc返回一个指向新分配内存的指针,而free用于释放已经分配但不再使用的内存。当循环遍历数组时,可能会有多个malloc操作,每个操作都会产生一个新的内存块,并且在循环结束后,这些内存块会被一次性地释放掉。这样就导致了数组的第一个元素在循环结束后变成了NULL,而不是在malloc操作之前就已经被释放掉了。

    为了修复这个错误,你需要确保在所有mallocfree调用之间有一个适当的空闲空间。你可以通过添加一些额外的逻辑来避免这种情况发生:

    #include <stdio.h>
    #include <stdlib.h>
    
    void print_books() {
        FILE *fp1;
        fp1 = fopen("Books.txt", "r");
        
        BookArray m;
        int i = 0;
    
        if (fp1 == NULL) {
            printf("Error opening file.\n");
            return;
        }
    
        while (fscanf(fp1, "%u,%[^,],%[^,],%u,%u", &m.id, &m.title, &m.authors, &m.year, &m.copies) != EOF) {
            Book *p = malloc(sizeof(Book));
            p->id = m.id;
            p->title = strdup(m.title);
            p->authors = strdup(m.authors);
            m.length++;
    
            if (p == NULL || !strdup(m.title) || !strdup(m.authors)) {
                printf("Memory allocation failed\n");
                free(m.title);
                free(m.authors);
                break;
            }
    
            p->year = m.year;
            p->copies = m.copies;
    
            m.length--;
            m.copies--;
    
            m.length++;
            m.copies++;
            m.length++;
            m.copies++;
    
            if (m.length > 100) {
                printf("Too many books in the array.\n");
                free(m.title);
                free(m.authors);
                break;
            }
            
            m.length++;
            m.copies++;
    
            if (m.length <= 100) {
                books[i++] = p;
            } else {
                books[i] = p;
                i++;
            }
    
            free(p);
    
            p = NULL;
        }
    
        fclose(fp1);
    }
    
    int main() {
        print_books();
        return 0;
    }
    

    这段代码首先打开文件,然后开始读取文件中的数据。在循环中,它将读取的信息存储在一个Book结构体中,并将其转换为BookArray类型的指针数组。最后,它将数组中的书名、作者等信息保存到Book结构体中,并将其转换为BookArray类型的指针数组。在循环结束时,如果数组的大小超过了100个元素,它就会抛出一个警告,因为这会导致内存泄漏。

    评论

报告相同问题?

悬赏问题

  • ¥18 光催化第一性原理计算析氢效率STH怎么计算
  • ¥100 Mac 版foxmail 收邮件问题
  • ¥15 QWebEngineView
  • ¥15 如何使用shufflenet进行手写数字识别
  • ¥15 .net core 同时编辑怎么防止数据串了
  • ¥20 微信小程序播放直播流
  • ¥15 关于迷宫自走单片机循迹小车的知识
  • ¥15 python使用selenium工具爬取网站的问题
  • ¥15 visual studio中c语言用ODBC链接SQL SERVER
  • ¥15 关于#python#的问题:如何通过pywinauto获取到图中“窗格”内部的内容