更如. 2022-06-01 16:15 采纳率: 66.7%
浏览 27

您好,请问缓冲区溢出是什么问题呢

#include <stdio.h> // 输入输出标准库
#include <stdlib.h> // malloc, realloc, exit等函数

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

// 线性表的顺序存储结构
typedef struct sqList {
int* elem; // 数据元素矩阵首地址
int length; // 当前元素个数
int listsize; // 最大元素个数
}SqList;

// 初始化顺序表
int InitList_Sq(SqList& L) {
L.elem = (int*)malloc(sizeof(int) * LIST_INIT_SIZE); // 动态分配内存
if (!L.elem) // 动态分配内存完毕后,一定要判断是否分配成功
exit(OVERFLOW);
// L.elem[0/1/2/3...]的初值是多少?
L.length = 0; // 当前元素个数0
L.listsize = LIST_INIT_SIZE; // 最大元素个数
return OK;
}

// 在顺序表L的第i个位置之前插入元素e
int ListInsert_Sq(SqList& L, int i, int e) {
if ((i < 1) || (i > L.length + 1)) // 插入位置i是否合法
return ERROR;
if (L.length >= L.listsize) { // 顺序表是否已满
int* newbase = (int*)realloc(L.elem,
sizeof(int) * (L.listsize + LISTINCREMENT)); // 重新申请空间
if (!newbase)
exit(OVERFLOW);
L.elem = newbase; // 更新基址
L.listsize = L.listsize + LISTINCREMENT; // 更新最大容量
}
for (int k = L.length; k >= i; k--) { // 数据依次后移
L.elem[k] = L.elem[k - 1];
}
L.elem[i - 1] = e; // 插入数据
L.length = L.length + 1; // 更新元素数量
return OK;
}

// 将顺序表L的第i个位置的数据删除 (将删除值赋给e并返回)
int ListDelete_Sq(SqList& L, int i, int& e) {
if ((i < 1) || (i > L.length)) // 删除位置i是否合法
return ERROR;
e = L.elem[i - 1]; // 返回数据
for (int k = i + 1; k <= L.length; k++) { // 将第i+1到第N个元素前移
L.elem[k - 2] = L.elem[k - 1]; //
}
L.length = L.length - 1; // 更新元素数量
return OK;
}

int main(void)
{
SqList L;
int a[10]= { 11,12,13,14,15,16,17,18,19,20 };

/*for (int i = 0; i < 10; i++) {
    scanf_s("%d", a[i]);
}*/
int n = sizeof(int);
// 初始化顺序表
int isDone = InitList_Sq(L);

// 建立一个初始序列, 长度10.
for (int i = 0; i < 10; i++) {
    isDone = ListInsert_Sq(L, i + 1, a[i]);
}
for (int i = 0; i < L.length; i++) {
    printf("%d ", L.elem[i]);
}
printf("\n");

// 在第5个位置插入999
isDone = ListInsert_Sq(L, 5, 999);
for (int i = 0; i < L.length; i++) {
  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-06-02 11:19
    关注

    没发现有bug:

    
    #include <stdio.h> // 输入输出标准库
    #include <stdlib.h> // malloc, realloc, exit等函数
    
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    #define LIST_INIT_SIZE 100
    #define LISTINCREMENT 10
    
    // 线性表的顺序存储结构
    typedef struct sqList {
        int* elem; // 数据元素矩阵首地址
        int length; // 当前元素个数
        int listsize; // 最大元素个数
    }
    SqList;
    
    // 初始化顺序表
    int InitList_Sq(SqList& L) {
        L.elem = (int*)malloc(sizeof(int) * LIST_INIT_SIZE); // 动态分配内存
        if (!L.elem) // 动态分配内存完毕后,一定要判断是否分配成功
            exit(OVERFLOW);
        // L.elem[0/1/2/3...]的初值是多少?
        L.length = 0; // 当前元素个数0
        L.listsize = LIST_INIT_SIZE; // 最大元素个数
        return OK;
    }
    
    // 在顺序表L的第i个位置之前插入元素e
    int ListInsert_Sq(SqList& L, int i, int e) {
        if ((i < 1) || (i > L.length + 1)) // 插入位置i是否合法
            return ERROR;
        if (L.length >= L.listsize) { // 顺序表是否已满
            int* newbase = (int*)realloc(L.elem,
                                         sizeof(int) * (L.listsize + LISTINCREMENT)); // 重新申请空间
            if (!newbase)
                exit(OVERFLOW);
            L.elem = newbase; // 更新基址
            L.listsize = L.listsize + LISTINCREMENT; // 更新最大容量
        }
        for (int k = L.length; k >= i; k--) { // 数据依次后移
            L.elem[k] = L.elem[k - 1];
        }
        L.elem[i - 1] = e; // 插入数据
        L.length = L.length + 1; // 更新元素数量
        return OK;
    }
    
    // 将顺序表L的第i个位置的数据删除 (将删除值赋给e并返回)
    int ListDelete_Sq(SqList& L, int i, int& e) {
        if ((i < 1) || (i > L.length)) // 删除位置i是否合法
            return ERROR;
        e = L.elem[i - 1]; // 返回数据
        for (int k = i + 1; k <= L.length; k++) { // 将第i+1到第N个元素前移
            L.elem[k - 2] = L.elem[k - 1]; //
        }
        L.length = L.length - 1; // 更新元素数量
        return OK;
    }
    
    int main(void) {
        SqList L;
        int a[10]= { 11,12,13,14,15,16,17,18,19,20 };
    
        /*for (int i = 0; i < 10; i++) {
            scanf_s("%d", a[i]);
        }*/
        int n = sizeof(int);
        // 初始化顺序表
        int isDone = InitList_Sq(L);
    
        // 建立一个初始序列, 长度10.
        for (int i = 0; i < 10; i++) {
            isDone = ListInsert_Sq(L, i + 1, a[i]);
        }
        for (int i = 0; i < L.length; i++) {
            printf("%d ", L.elem[i]);
        }
        printf("\n");
    
        // 在第5个位置插入999
        isDone = ListInsert_Sq(L, 5, 999);
        for (int i = 0; i < L.length; i++) {
            printf("%d ", L.elem[i]);
        }
        printf("\n");
        return 0;
    }
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 6月1日

悬赏问题

  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。