疑似越界问题

mini梁翊洲MAX 2020-06-04 10:42:11
大一新生,在尝试实现神经网络的padding时,在下面代码标红处出现了(0x00845695 处(位于 作业.exe 中)引发的异常: 0xC0000005: 写入位置 0xCDCDCDCD 时发生访问冲突。) 怀疑是否有越界问题,但细看代码觉得合理。遂来问各位大佬,请大佬们不吝赐教。
#include<stdio.h>
#include<malloc.h>
int main()
{
int** a;//创建二维数组a
int i, j;
a = (int**)malloc(sizeof(int*) * 3);//行数为3
for (i = 0; i < 3; i++)
a[i] = (int*)malloc(sizeof(int) * 3);//列数为3
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
scanf_s("%d", &a[i][j]);//输入a各个位置的值
int padding = 0;
scanf_s("%d", &padding);//输入padding的值
if (padding > 0)
{
int** b;//创建二维数组b
b = (int**)malloc(sizeof(int*) * (3 + 2 * padding));//行数上下加padding行
for (i = padding; i < (3 + 2 * padding); i++)
b[i] = (int*)malloc(sizeof(int) * (3 + 2 * padding));//列数左右加padding列
for (i = padding; i < (3 + padding); i++)
for (j = padding; j < (3 + padding); j++)
b[i][j] = a[i - padding][j - padding];//将a的值嵌入b的正中间
for (i = 0; i < padding; i++)//给前padding行的元素赋值0
for (j = 0; j < (3 + padding); j++)
b[i][j] = 0;
for (i = (2 + padding); i < (3 + 2 * padding); i++)//给后padding行的元素赋值0
for (j = (2 + padding); j < (3 + 2 * padding); j++)
b[i][j] = 0;
for (j = 0; j < (3 + padding); j++)//给前padding列的元素赋值0
for (i = 0; i < padding; i++)
b[i][j] = 0;
for (j = (2 + padding); j < (3 + 2 * padding); j++)//给后padding列的元素赋值0
for (i = (2 + padding); i < (3 + 2 * padding); i++)
b[i][j] = 0;
printf("%d", b[0][0]);//输出b
free(b[i]);//释放b
free(*b);
}
free(a[i]);//释放a
free(*a);
}
...全文
228 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mini梁翊洲MAX 2020-06-06
  • 打赏
  • 举报
回复
引用 9 楼 自信男孩的回复:
[quote=引用 8 楼 kasami_ 的回复:]
[quote=引用 7 楼 自信男孩的回复:]
free(*a);

这句改成

free(a);

还是触发了断点呢,调试时在一进入循环就报错了[/quote]
你要做什么功能?说一下你的需求[/quote] 把释放a和b都改为free(a)和free(b)就解决了。我想请问一下为什么不free(a[i])和*a呢?
自信男孩 2020-06-06
  • 打赏
  • 举报
回复
引用 8 楼 kasami_ 的回复:
[quote=引用 7 楼 自信男孩的回复:]
free(*a);

这句改成

free(a);

还是触发了断点呢,调试时在一进入循环就报错了[/quote]
你要做什么功能?说一下你的需求
smwhotjay 2020-06-04
  • 打赏
  • 举报
回复
异常: 0xC0000005: 指针异常
写入位置 0xCDCDCDCD debug模式下某个指针空的未初始化就被调用了
自信男孩 2020-06-04
  • 打赏
  • 举报
回复
        free(b[i]);//释放b
free(*b);

这是怎么回事?free(b[i])也不在循环里呢?你没加大括号呢?所以b[i]肯定是越界,free(b[i]);肯定会出错。
mini梁翊洲MAX 2020-06-04
  • 打赏
  • 举报
回复
引用 7 楼 自信男孩的回复:
free(*a);

这句改成

free(a);
还是触发了断点呢,调试时在一进入循环就报错了
自信男孩 2020-06-04
  • 打赏
  • 举报
回复
free(*a);

这句改成

free(a);
mini梁翊洲MAX 2020-06-04
  • 打赏
  • 举报
回复
引用 5 楼 自信男孩 的回复:
[quote=引用 4 楼 kasami_ 的回复:] [quote=引用 2 楼 smwhotjay的回复:]异常: 0xC0000005: 指针异常 写入位置 0xCDCDCDCD debug模式下某个指针空的未初始化就被调用了
是的。前面给b分配内存时分配错误了。在解决已知问题再运行后,在释放a时显示已触发一个断点,请问是怎么回事啊?要如何解决呢?[/quote] 处理和b一样,需要循环把a[i]释放,你直接在外面free(a[i]);那么i是几呢?是不是也越界了呢? [/quote] 给您看看更改后释放a的部分: for (i = 0; i < 3; i++) free(a[i]);//释放a free(*a); 我就只是在原来的基础上引入了一个循环,我觉得这没什么问题才对的。再次感谢您的回答。
自信男孩 2020-06-04
  • 打赏
  • 举报
回复
引用 4 楼 kasami_ 的回复:
[quote=引用 2 楼 smwhotjay的回复:]异常: 0xC0000005: 指针异常
写入位置 0xCDCDCDCD debug模式下某个指针空的未初始化就被调用了

是的。前面给b分配内存时分配错误了。在解决已知问题再运行后,在释放a时显示已触发一个断点,请问是怎么回事啊?要如何解决呢?[/quote]
处理和b一样,需要循环把a[i]释放,你直接在外面free(a[i]);那么i是几呢?是不是也越界了呢?
mini梁翊洲MAX 2020-06-04
  • 打赏
  • 举报
回复
引用 2 楼 smwhotjay的回复:
异常: 0xC0000005: 指针异常
写入位置 0xCDCDCDCD debug模式下某个指针空的未初始化就被调用了
是的。前面给b分配内存时分配错误了。在解决已知问题再运行后,在释放a时显示已触发一个断点,请问是怎么回事啊?要如何解决呢?
mini梁翊洲MAX 2020-06-04
  • 打赏
  • 举报
回复
引用 1 楼 自信男孩的回复:
        free(b[i]);//释放b
free(*b);

这是怎么回事?free(b[i])也不在循环里呢?你没加大括号呢?所以b[i]肯定是越界,free(b[i]);肯定会出错。
是的。这是这个代码的问题之一。我把它修正过来之后调试。在释放b的时候正常,在释放a时显示触发一个断点。请问是怎么一回事啊?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧