鱼C论坛

 找回密码
 立即注册
查看: 1054|回复: 4

关于内存溢出

[复制链接]
发表于 2022-2-24 14:56:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include"dynaicArray.h"

//初始化数组   参数  初始化数组容量 返回值 数组指针
struct dynamicArray* init_dynamicArray(int capacity)
{
        if (capacity <= 0)
        {
                return NULL;
        }
        //给数组分配内存
        struct dynamicArray* arr = malloc(sizeof(struct dynamicArray));
        if (arr == NULL)
        {
                return NULL;
        }
        //给属性初始化
        arr->pAddr = malloc(sizeof(void *)* capacity);
        if (arr->pAddr == NULL)
        {
                return NULL;
        }
        //容量初始化
        arr->m_Capacity = capacity;
        //大小初始化
        arr->m_Size = 0;

        return arr;
}

//插入数组
void insert_dynaminArray(struct dynamicArray* arr, void* data, int pos)
{
        if (arr == NULL)
        {
                return;
        }
        if (data == NULL)
        {
                return;
        }
        if (pos < 0 || pos > arr->m_Size)
        {
                //尾插
                pos = arr->m_Size;
        }
        //判断数组是否满了
        if (arr->m_Size == arr->m_Capacity)
        {
                //计算新内存的大小
                int newCapacity = arr->m_Capacity * 2;
                //开辟新空间
                void** newSpace = malloc(sizeof(void* ) * newCapacity);
                if (newSpace == NULL)
                {
                        return;
                }
                //将原空间下数据拷贝到新空间下
                memcpy(newSpace, arr->pAddr, sizeof(void*)* arr->m_Capacity);
                //释放原有空间
                free(arr->pAddr);
                //更改指针指向
                arr->pAddr = newSpace;
                //更改新的容量
                arr->m_Capacity = newCapacity;
        }
        //将新元素插入到数组中指定位置
        for (int i = arr->m_Size - 1; i >= pos; i--)
        {
                //数据往后移动
                arr->pAddr[i + 1] = arr->pAddr[i];
        }
        //将数据插入到指定位置
        arr->pAddr[pos] = data;
        //更新数组大小
        arr->m_Size++;
}

//遍历
void foreach_dynamicArray(struct dynamicArray* arr, void(*myPrint)(void*))
{
        if (arr == NULL)
        {
                return;
        }
        for (int i = 0; i < arr->m_Size; i++)
        {
                myPrint(arr->pAddr[i]);
        }

}
--------------------------------------------------------------------------------------------------------------------------------------------------------

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//容量和大小的区别:一个是能装多少,一个是装了多少。
struct dynamicArray
{
        //维护真实在堆区开辟数组指针
        void** pAddr;
        //数组的容量
        int m_Capacity;
        //数组的大小
        int m_Size;
};

struct PERSON
{
        char name[64];
        int age;
};

//初始化数组
struct dynamicArray* init_dynamicArray(int capacity);

//插入数组
void insert_dynaminArray(struct dynamicArray* arr, void* data, int pos);

//遍历动态数组
void foreach_dynamicArray(struct dynamicArray* arr, void(*myprint)(void*));
---------------------------------------------------------------------------------------------------------------------------------------------------------
严重性        代码        说明        项目        文件        行        禁止显示状态
警告        C6386        写入到“arr->pAddr”时缓冲区溢出: 可写大小为“sizeof(void *)*newCapacity”个字节,但可能写入了“8”个字节。        动态数组的实现        C:\Users\x\source\repos\数据结构\动态数组的实现.c        70       

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-28 14:53:50 | 显示全部楼层
void** newSpace = malloc(sizeof(void* ) * (newCapacity + 2));
我扩充了newSpace的大小,消除了 C6386  警告
但是(newCapacity + 1))依旧会报这个警告
+2之后就不会报
有大佬解释一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-28 15:11:21 | 显示全部楼层
xyj1 发表于 2022-2-28 14:53
void** newSpace = malloc(sizeof(void* ) * (newCapacity + 2));
我扩充了newSpace的大小,消除了 C6386  ...

把代码发完整
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-3 08:47:27 | 显示全部楼层

不完整吗?我贴了封装函数的所有程序啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-3 11:54:18 | 显示全部楼层
xyj1 发表于 2022-3-3 08:47
不完整吗?我贴了封装函数的所有程序啊。
  1. $ cat main.c
  2. //#include"dynaicArray.h"

  3. //#pragma once
  4. //#define _CRT_SECURE_NO_WARNINGS
  5. #include<stdio.h>
  6. #include<string.h>
  7. #include<stdlib.h>

  8. //容量和大小的区别:一个是能装多少,一个是装了多少。
  9. struct dynamicArray
  10. {
  11.         //维护真实在堆区开辟数组指针
  12.         void** pAddr;
  13.         //数组的容量
  14.         int m_Capacity;
  15.         //数组的大小
  16.         int m_Size;
  17. };

  18. struct PERSON
  19. {
  20.         char name[64];
  21.         int age;
  22. };

  23. //初始化数组
  24. struct dynamicArray* init_dynamicArray(int capacity);

  25. //插入数组
  26. void insert_dynaminArray(struct dynamicArray* arr, void* data, int pos);

  27. //遍历动态数组
  28. void foreach_dynamicArray(struct dynamicArray* arr, void(*myprint)(void*));

  29. //初始化数组   参数  初始化数组容量 返回值 数组指针
  30. struct dynamicArray* init_dynamicArray(int capacity)
  31. {
  32.         if (capacity <= 0)
  33.         {
  34.                 return NULL;
  35.         }
  36.         //给数组分配内存
  37.         struct dynamicArray* arr = malloc(sizeof(struct dynamicArray));
  38.         if (arr == NULL)
  39.         {
  40.                 return NULL;
  41.         }
  42.         //给属性初始化
  43.         arr->pAddr = malloc(sizeof(void *)* capacity);
  44.         if (arr->pAddr == NULL)
  45.         {
  46.                 return NULL;
  47.         }
  48.         //容量初始化
  49.         arr->m_Capacity = capacity;
  50.         //大小初始化
  51.         arr->m_Size = 0;

  52.         return arr;
  53. }

  54. //插入数组
  55. void insert_dynaminArray(struct dynamicArray* arr, void* data, int pos)
  56. {
  57.         if (arr == NULL)
  58.         {
  59.                 return;
  60.         }
  61.         if (data == NULL)
  62.         {
  63.                 return;
  64.         }
  65.         if (pos < 0 || pos > arr->m_Size)
  66.         {
  67.                 //尾插
  68.                 pos = arr->m_Size;
  69.         }
  70.         //判断数组是否满了
  71.         if (arr->m_Size == arr->m_Capacity)
  72.         {
  73.                 //计算新内存的大小
  74.                 int newCapacity = arr->m_Capacity * 2;
  75.                 //开辟新空间
  76.                 void** newSpace = malloc(sizeof(void* ) * newCapacity);
  77.                 if (newSpace == NULL)
  78.                 {
  79.                         return;
  80.                 }
  81.                 //将原空间下数据拷贝到新空间下
  82.                 memcpy(newSpace, arr->pAddr, sizeof(void*)* arr->m_Capacity);
  83.                 //释放原有空间
  84.                 free(arr->pAddr);
  85.                 //更改指针指向
  86.                 arr->pAddr = newSpace;
  87.                 //更改新的容量
  88.                 arr->m_Capacity = newCapacity;
  89.         }
  90.         //将新元素插入到数组中指定位置
  91.         for (int i = arr->m_Size - 1; i >= pos; i--)
  92.         {
  93.                 //数据往后移动
  94.                 arr->pAddr[i + 1] = arr->pAddr[i];
  95.         }
  96.         //将数据插入到指定位置
  97.         arr->pAddr[pos] = data;
  98.         //更新数组大小
  99.         arr->m_Size++;
  100. }

  101. //遍历
  102. void foreach_dynamicArray(struct dynamicArray* arr, void(*myPrint)(void*))
  103. {
  104.         if (arr == NULL)
  105.         {
  106.                 return;
  107.         }
  108.         for (int i = 0; i < arr->m_Size; i++)
  109.         {
  110.                 myPrint(arr->pAddr[i]);
  111.         }

  112. }
  113. $ gcc-debug -o main main.c
  114. /usr/bin/ld: /usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/Scrt1.o: in function `_start':
  115. (.text+0x1b): undefined reference to `main'
  116. collect2: error: ld returned 1 exit status
  117. $
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-23 01:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表