各位大佬,我的这个C语言程序为什么一直报错啊??!

各位大佬我的程序莫名报错,调了一个上午,把能改的地方都改了,也不知道怎么回事求大佬们看看帮帮忙啊!!
程序逻辑很简单,就是读取文件,每行存到一个堆上的字符串里,最后free内存,分配堆内存函数多了个统计一共分配了多少内存的功能。
程序执行到main函数中的while块分配内存语句时,有时报错有时不报错(符号未加载、出发了一个断点、引起了一个异常等错误),在最后的free_pstring中肯定报错!
有没有大佬能帮帮忙啊,哭了ToT

// global.h
extern size_t mem; // 内存分配总量
extern size_t cmpnum; // 比较次数
// global.c
size_t mem = 0; // 内存分配总量
size_t cmpnum = 0; // 比较次数

// provided.h
#include "pstring.h"
void* bupt_malloc(size_t size);
int byte_cmp(char a, char b);
// provided.c
#include "provided.h"
#include "global.h"
#include "pstring.h"
#include<stdio.h>
#include<string.h>
void* bupt_malloc(size_t size){
if (size <= 0)
return NULL;
mem += size;
return malloc(size * sizeof(char));
}
int byte_cmp(char a, char b){
++cmpnum;
return (a - b);
}

// pstring.h
#include<string.h>
typedef struct Pstring{
char *pstring;
}Pstring;
void init_pstring(Pstring* ps, const char *str);
void free_pstring(Pstring *ps);
// pstring.c
#include "provided.h"
#include "pstring.h"
#include<string.h>
void init_pstring(Pstring* ps, const char *str){
int len = strlen(str) + 1;
ps->pstring = (char*)bupt_malloc(sizeof(char) * len);
strcpy(ps->pstring, str);
}
void free_pstring(Pstring *ps){
free(ps->pstring);
}

// Main.c
#include<stdio.h>
#include<string.h>
#include "provided.h"
#include "pstring.h"
#include "global.h"

int main(){
FILE* fp = fopen("test.txt", "r");
char line[256];
memset(line, 0, 256);
Pstring *ps = (Pstring*)bupt_malloc(10 * sizeof(Pstring));
int t = 0;
size_t size_of_pstring = sizeof(Pstring*);
while (!feof(fp)){
fgets(line, 255, fp);
init_pstring(ps+t*size_of_pstring, line);
++t;
}
for (int j = 0; j < 10; ++j){
free_pstring(ps + j * size_of_pstring);
}
free(ps);
fclose(fp);
return 0;
}

free释放内存块不要改变最初申请内存块的起始地址。
像你这样free_pstring(ps + j * size_of_pstring);是不对的。
free既然只有1个参数,那它怎么知道要释放的内存块大小,说明在你使用malloc申请内存块的时候,这个连续地址里包含了内存块的大小信息。所以你应该直接用free(ps)释放申请的内存。当需要再次申请新的内存块时再使用malloc申请。

你可以试试:
char *str=(char *)malloc(sizeof(char)*5);
if(str)
{
strcpy(str,"abcd");
free(str+1);//正常释放应该写free(str)
printf("%s",str);
}
你会发现释放后,地址依然可以正常打印。追问

不对呀大佬,我申请内存的语句init_pstring(ps+t*size_of_pstring, line);就是在ps数组的不同位置分别调用malloc,那free的时候也在ps数组的相应不同位置调用free,这样做也不可以吗?
把申请内存的语句改成init_pstring(&ps[t], line);释放内存也做类似修改,程序就不报错了。但我完全不知道这样有什么区别呀。。大佬能指点两句吗

追答

好吧,你那ps是结构数组,那么你确定free_pstring那个函数有没有取到空值,我看你这个函数没有判断ps是否为空,就取其成员。另外你用结构大小来偏移指针,确定没有越界,近期都在外出,你再研究下吧。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答