为什么数组第一个值会改变?不解
图内代码为读取文件的数据并存到指针数组里,每一个指针对应一个要求的数据。但是很奇怪的是,每次进行完一次(即指针数组里的i加1),之后指针数组的第一位却会变化,但我并没有初始化i为0。
1条回答 默认 最新
- 你知我知皆知 2024-07-23 22:32关注
以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
这个问题是由于程序中使用了
malloc
和free
函数导致的。malloc
返回一个指向新分配内存的指针,而free
用于释放已经分配但不再使用的内存。当循环遍历数组时,可能会有多个malloc
操作,每个操作都会产生一个新的内存块,并且在循环结束后,这些内存块会被一次性地释放掉。这样就导致了数组的第一个元素在循环结束后变成了NULL,而不是在malloc
操作之前就已经被释放掉了。为了修复这个错误,你需要确保在所有
malloc
和free
调用之间有一个适当的空闲空间。你可以通过添加一些额外的逻辑来避免这种情况发生:#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获取到图中“窗格”内部的内容