今天碰到一个奇怪的问题,数组下标也没有出现溢出的情况,但是就是在调试的时候崩在return 0
上。
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
struct MM{
char name[20];
int age;
};
struct Data {
MM mmData;
int index;
};
typedef struct sqList {
Data* pMemory;
int Cursize;
int MAX;
}*SQL;
SQL CreateSQL() {
SQL sqlist = (SQL)malloc(sizeof(sqList));
assert(sqlist);
sqlist->MAX = 3;
sqlist->pMemory = (Data*)malloc(sizeof(Data) * sqlist->MAX);
assert(sqlist->pMemory);
sqlist->Cursize = 0;
return sqlist;
}
bool temp(SQL sqlist) {
return sqlist->Cursize == 0;
}
void rellocMemory(SQL sqlist,int newSize) {
void* p=(Data*)realloc(sqlist->pMemory, sizeof(Data)*newSize);
assert(p);
}
void insertSQlist(SQL sqlist,Data data) {
if (sqlist->Cursize+1== sqlist->MAX) {
rellocMemory(sqlist, sqlist->MAX*2);
sqlist->MAX *= 2;
}
sqlist->pMemory[sqlist->Cursize] = data;
for (int i = sqlist->Cursize; i > 0; i--) {
if (sqlist->pMemory[i - 1].index > sqlist->pMemory[i].index) {
int tempData = sqlist->pMemory[i].index;
sqlist->pMemory[i].index = sqlist->pMemory[i - 1].index;
sqlist->pMemory[i - 1].index = tempData;
}
else {
break;
}
}
sqlist->Cursize++;
}
void deleteSqList(SQL sqlist,int index) {
int pos = -1;
for (int i = 0; i < sqlist->Cursize; i++) {
if (sqlist->pMemory[i].index == index) {
pos = i;
break;
}
}
if (pos ==-1)
return;
for (int i = pos; i < sqlist->Cursize-1; i++) {
sqlist->pMemory[i] = sqlist->pMemory[i + 1];
}
sqlist->Cursize--;
}
void deleteSortIndex(SQL sqlist, int sortIndex) {
if (sortIndex > sqlist->Cursize - 1||sortIndex<0) {
return;
}
for (int i = sortIndex-1; i < sqlist->Cursize-1; i++) {
sqlist->pMemory[i] = sqlist->pMemory[i + 1];
}
sqlist->Cursize--;
}
void printSqList(SQL sqlist) {
printf("序号\t姓名\t年龄\n");
for (int i = 0; i <sqlist->Cursize; i++) {
printf("%d\t%s\t%d\n", sqlist->pMemory[i].index, sqlist->pMemory[i].mmData.name, sqlist->pMemory[i].mmData.age);
}
}
int main() {
SQL sqlist = CreateSQL();
Data data[5] = { "小明",18,5,"小红",19,3,"小刚",17,4,"小米",20,1,"小芳",16,9 };
for (int i = 0; i < 5; i++)
insertSQlist(sqlist, data[i]);
printSqList(sqlist);
deleteSortIndex(sqlist, 3);
printSqList(sqlist);
return 0;
}
后来把realloc的返回值赋值给sqlist->pMemory(所要重新申请内存的那个指针本身)程序就正常运行了。