Access violation writing location 错误

qq_22722049 2016-07-06 03:19:53

#include <stdio.h>
#include <malloc.h>
double ****PsiDDiffj,
****PsiDDiffi,
****sDDiff,
r_h = 10;

int ****NorDiff,
numv = 100;
Generate_PsiDuopolyDiff() {
int aa, bb, cc, dd;
double vv_ja, vv_jb, vv_ia, vv_ib, deltav = r_h / numv, ll;
PsiDDiffj = (double ****)malloc((numv + 2) * sizeof(double***));
PsiDDiffi = (double ****)malloc((numv + 2) * sizeof(double***));
sDDiff = (double ****)malloc((numv + 2) * sizeof(double***));
NorDiff = (int ****)malloc((numv + 2) * sizeof(int***));
for (aa = 0; aa <= numv; aa++) {
PsiDDiffj[aa] = (double ***)malloc((numv + 2) * sizeof(double**));
PsiDDiffi[aa] = (double ***)malloc((numv + 2) * sizeof(double**));
sDDiff[aa] = (double ***)malloc((numv + 2) * sizeof(double**));
NorDiff[aa] = (int ***)malloc((numv + 2) * sizeof(int**));
for (bb = 0; bb <= numv; bb++) {
PsiDDiffj[aa][bb] = (double **)malloc((numv + 2) * sizeof(double*));
PsiDDiffi[aa][bb] = (double **)malloc((numv + 2) * sizeof(double*));
sDDiff[aa][bb] = (double **)malloc((numv + 2) * sizeof(double*));
NorDiff[aa][bb] = (int **)malloc((numv + 2) * sizeof(int*));
for (cc = 0; cc <= numv; cc++) {
PsiDDiffj[aa][bb][cc] = (double *)malloc((numv + 2) * sizeof(double )); //where the error happened
PsiDDiffi[aa][bb][cc] = (double *)malloc((numv + 2) * sizeof(double ));
sDDiff[aa][bb][cc] = (double *)malloc((numv + 2) * sizeof(double ));
NorDiff[aa][bb][cc] = (int *)malloc((numv + 2) * sizeof(int ));
}
}
}
}
void
main() {
Generate_PsiDuopolyDiff();
}


我现在要生成一个四维的数组,然后我是确定数组大小的。((numv + 2)*(numv + 2)*(numv + 2)*(numv + 2))但是编译的时候报错,显示Access violation writing location。 求问为什么?谢谢大家!
...全文
943 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-07-07
  • 打赏
  • 举报
回复
13楼正解!
flying_music 2016-07-07
  • 打赏
  • 举报
回复
引用 8 楼 qq_22722049 的回复:
[quote=引用 4 楼 qq423399099 的回复:] 调试了发现 某次循环中PsiDDiffj[aa][bb]为NULL,然后你 PsiDDiffj[aa][bb][cc]自然就崩溃了 (崩溃的时候a=66,b=28,VS下测试结果) 原因是你malloc的空间太大了,所以导致你malloc失败了。 你把numv换成小点的数字是OK的 楼主你自己算算看好了: 1.最内存的cc循环,每循环一次占用:102*8*3+102*4=2856字节 2.bb循环,每循环一次占用:(102*8*3+102*4)*100+102*4*4=287232字节 3.aa循环,每循环一次占用:((102*8*3+102*4)*100+102*4*4)*100+102*4*4=28724832字节=27.39M 所以a=66,b=28的时候,堆空间已经耗尽了 Linux虚拟地址空间内核占1GB,留给用户进程3GB,Windows是各占2GB,用户空间也是用户进程最大的堆申请数量了。但考虑到程序本身大小,动态库等因素,实际的堆申请数量是达不到最大值的,Linux小于3GB,Windows小于2GB。
求问一下那这种情况我要怎么编写程序会比较好呢?因为我要有一个4维的array,然后往每一个[aa][bb][cc][dd]里面填写值,之后还要调用里面的值。numv这里我设置的小了,后面运行的时候我需要numv = 1000.[/quote] 这么多数据程序不可能同时用到吧,动态分配的重要好处就是及时分配和回收,也就是需要的时候才分配,不需要了赶紧释放,这样才会有效利用内存,我建议你可以先把numv设小一点,让程序先跑起来,等你把整个程序弄懂了,知道程序先用哪些数据再用哪些数据了再改你的程序,也就是分步分配内存,而不是一下分配那么多,90%以上的程序Windows的内存系统肯定是可以满足的,如果不能满足那八成是你的程序有问题了,既然numv=100都不能满足,那numv=1000得用什么样的机器才能跑你的程序啊
paschen 版主 2016-07-07
  • 打赏
  • 举报
回复
出错时看断在哪,通过调用堆栈、变量窗口等来观察分析原因
qq_22722049 2016-07-06
  • 打赏
  • 举报
回复
引用 11 楼 qq423399099 的回复:
你一部分一部分处理不行? 处理完不再需要的数据就delete掉
因为我是编译一个动态规划问题,然后这个等于是我一期的code,我后面还有一部分code就是要调用里面的值
小灸舞 2016-07-06
  • 打赏
  • 举报
回复
你一部分一部分处理不行? 处理完不再需要的数据就delete掉
赵4老师 2016-07-06
  • 打赏
  • 举报
回复
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
qq_22722049 2016-07-06
  • 打赏
  • 举报
回复
引用 6 楼 paschen 的回复:
楼主到底是在编译时还是运行时报错? 出错时定位到哪一行,具体分析一下原因
是运行(按F5)的时候
qq_22722049 2016-07-06
  • 打赏
  • 举报
回复
引用 4 楼 qq423399099 的回复:
调试了发现 某次循环中PsiDDiffj[aa][bb]为NULL,然后你 PsiDDiffj[aa][bb][cc]自然就崩溃了 (崩溃的时候a=66,b=28,VS下测试结果) 原因是你malloc的空间太大了,所以导致你malloc失败了。 你把numv换成小点的数字是OK的 楼主你自己算算看好了: 1.最内存的cc循环,每循环一次占用:102*8*3+102*4=2856字节 2.bb循环,每循环一次占用:(102*8*3+102*4)*100+102*4*4=287232字节 3.aa循环,每循环一次占用:((102*8*3+102*4)*100+102*4*4)*100+102*4*4=28724832字节=27.39M 所以a=66,b=28的时候,堆空间已经耗尽了 Linux虚拟地址空间内核占1GB,留给用户进程3GB,Windows是各占2GB,用户空间也是用户进程最大的堆申请数量了。但考虑到程序本身大小,动态库等因素,实际的堆申请数量是达不到最大值的,Linux小于3GB,Windows小于2GB。
求问一下那这种情况我要怎么编写程序会比较好呢?因为我要有一个4维的array,然后往每一个[aa][bb][cc][dd]里面填写值,之后还要调用里面的值。numv这里我设置的小了,后面运行的时候我需要numv = 1000.
qq_22722049 2016-07-06
  • 打赏
  • 举报
回复
不好意思,我是初学者。表达不是很好。应该是运行的时候显示Access violation writing location错误。
paschen 版主 2016-07-06
  • 打赏
  • 举报
回复
楼主到底是在编译时还是运行时报错? 出错时定位到哪一行,具体分析一下原因
paschen 版主 2016-07-06
  • 打赏
  • 举报
回复
楼主到底是在编译时还是运行时报错? 出错时定位到哪一行,具体分析一下原因
小灸舞 2016-07-06
  • 打赏
  • 举报
回复
调试了发现
某次循环中PsiDDiffj[aa][bb]为NULL,然后你 PsiDDiffj[aa][bb][cc]自然就崩溃了
(崩溃的时候a=66,b=28,VS下测试结果)
原因是你malloc的空间太大了,所以导致你malloc失败了。
你把numv换成小点的数字是OK的

楼主你自己算算看好了:
1.最内存的cc循环,每循环一次占用:102*8*3+102*4=2856字节
2.bb循环,每循环一次占用:(102*8*3+102*4)*100+102*4*4=287232字节
3.aa循环,每循环一次占用:((102*8*3+102*4)*100+102*4*4)*100+102*4*4=28724832字节=27.39M
所以a=66,b=28的时候,堆空间已经耗尽了
Linux虚拟地址空间内核占1GB,留给用户进程3GB,Windows是各占2GB,用户空间也是用户进程最大的堆申请数量了。但考虑到程序本身大小,动态库等因素,实际的堆申请数量是达不到最大值的,Linux小于3GB,Windows小于2GB。
wen_eric 2016-07-06
  • 打赏
  • 举报
回复
很可能是越界了
flying_music 2016-07-06
  • 打赏
  • 举报
回复
你电脑的配置的是多大内存啊,在我电脑上编译没错啊,就是运行时内存不够分配,把numv改小一点就可以了 Access violation writing location是访问内存错误,应该是运行时错误吧,怎么会出现在编译的时候呢
ri_aje 2016-07-06
  • 打赏
  • 举报
回复
改成用 vector 的
赵4老师 2016-07-06
  • 打赏
  • 举报
回复
用文件读写代替内存读写。 参考_fseeki64函数。

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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