有关“CRT detect that the application wrote to memory after end of heap buffer”问题的解决
2014-03-05 15:59
411 查看
今天在编写函数求解矩阵的逆时出现“CRT detect that the application wrote to memory after end of heap buffer”的问题,主要代码如下:
a = (double**)malloc(N*sizeof(int*));
L = (double**)malloc(N*sizeof(int*));
U = (double**)malloc(N*sizeof(int*));
out = (double**)malloc(N*sizeof(int*));
out1 = (double**)malloc(N*sizeof(int*));
r = (double**)malloc(N*sizeof(int*));
u = (double**)malloc(N*sizeof(int*));
for(count=0;count<N;count++)
{ a[count]=(double*)malloc(N*sizeof(double));
L[count]=(double*)malloc(N*sizeof(double));
U[count]=(double*)malloc(N*sizeof(double)));
out[count]=(double*)malloc(N*sizeof(double));
out1[count]=(double*)malloc(N*sizeof(double));
r[count]=(double*)malloc(N*sizeof(double));
u[count]=(double*)malloc(N*sizeof(double));
}
memset( &a[0][0] , 1, N*N);
memset( &L[0][0] , 1 , N*N);
memset( &U[0][0] , 1 , N*N);
memset( &out[0][0] , 1 , N*N);
memset( &out1[0][0] , 1 , N*N);
memset( &r[0][0] , 1 , N*N);
memset( &u[0][0] , 1 , N*N);
... ...
for (count=0;count<N;count++)
{
free(a[count]);
free(L[count]);
free(U[count]);
free(out[count]);
free(out1[count]);
free(r[count]);
free(u[count]);
}
free(a);
free(L);
free(U);
free(out);
free(out1);
free(r);
free(u);
return 1;
}
调试时是在free处出现错误,经过分析查资料知道是memset函数处出现了问题,应该改为
memset( &a[0][0] , 1, sizeof(a));
memset( &L[0][0] , 1 , sizeof(L));
memset( &U[0][0] , 1 , sizeof(U));
memset( &out[0][0] , 1 , sizeof(out));
memset( &out1[0][0] , 1 , sizeof(out1));
memset( &r[0][0] , 1 , sizeof(r));
memse
4000
t( &u[0][0] , 1 , sizeof(u));
或
for (count=0;count<N;count++)
{
memset(a[count], 1, N*sizeof(double));
memset(L[count], 1, N*sizeof(double));
memset(U[count], 1, N*sizeof(double));
memset(out[count], 1, N*sizeof(double));
memset(out1[count], 1, N*sizeof(double));
memset(r[count], 1, N*sizeof(double));
memset(u[count], 1, N*sizeof(double));
}
原因:出现越界,初始化数组时写入了未分配的内存,并且在sizeof(int *) <= sizeof(double)的时候是成立的,所以在写入长度小于分配长度时不报错,但这样不合理,应该初始化数组的所有元素,以防不可预知的错误。
a = (double**)malloc(N*sizeof(int*));
L = (double**)malloc(N*sizeof(int*));
U = (double**)malloc(N*sizeof(int*));
out = (double**)malloc(N*sizeof(int*));
out1 = (double**)malloc(N*sizeof(int*));
r = (double**)malloc(N*sizeof(int*));
u = (double**)malloc(N*sizeof(int*));
for(count=0;count<N;count++)
{ a[count]=(double*)malloc(N*sizeof(double));
L[count]=(double*)malloc(N*sizeof(double));
U[count]=(double*)malloc(N*sizeof(double)));
out[count]=(double*)malloc(N*sizeof(double));
out1[count]=(double*)malloc(N*sizeof(double));
r[count]=(double*)malloc(N*sizeof(double));
u[count]=(double*)malloc(N*sizeof(double));
}
memset( &a[0][0] , 1, N*N);
memset( &L[0][0] , 1 , N*N);
memset( &U[0][0] , 1 , N*N);
memset( &out[0][0] , 1 , N*N);
memset( &out1[0][0] , 1 , N*N);
memset( &r[0][0] , 1 , N*N);
memset( &u[0][0] , 1 , N*N);
... ...
for (count=0;count<N;count++)
{
free(a[count]);
free(L[count]);
free(U[count]);
free(out[count]);
free(out1[count]);
free(r[count]);
free(u[count]);
}
free(a);
free(L);
free(U);
free(out);
free(out1);
free(r);
free(u);
return 1;
}
调试时是在free处出现错误,经过分析查资料知道是memset函数处出现了问题,应该改为
memset( &a[0][0] , 1, sizeof(a));
memset( &L[0][0] , 1 , sizeof(L));
memset( &U[0][0] , 1 , sizeof(U));
memset( &out[0][0] , 1 , sizeof(out));
memset( &out1[0][0] , 1 , sizeof(out1));
memset( &r[0][0] , 1 , sizeof(r));
memse
4000
t( &u[0][0] , 1 , sizeof(u));
或
for (count=0;count<N;count++)
{
memset(a[count], 1, N*sizeof(double));
memset(L[count], 1, N*sizeof(double));
memset(U[count], 1, N*sizeof(double));
memset(out[count], 1, N*sizeof(double));
memset(out1[count], 1, N*sizeof(double));
memset(r[count], 1, N*sizeof(double));
memset(u[count], 1, N*sizeof(double));
}
原因:出现越界,初始化数组时写入了未分配的内存,并且在sizeof(int *) <= sizeof(double)的时候是成立的,所以在写入长度小于分配长度时不报错,但这样不合理,应该初始化数组的所有元素,以防不可预知的错误。
相关文章推荐
- 关于指针的一些事情
- C/C++数据对齐详细解析
- C++中引用的使用总结
- C与C++之间相互调用实例方法讲解
- C++中引用(&)的用法与应用实例分析
- 解析C++ 浮点数的格式化输出
- 深入分析C++中几个最不常用的关键字
- c++中inline的用法分析
- C++ Primer 第一部分基本语言
- 深入解析C++ Data Member内存布局
- 从汇编看c++中默认构造函数的使用分析
- 关于C++中的友元函数的一些总结
- C++的sstream标准库详细介绍
- 基于C++自动化编译工具的使用详解
- 浅谈C++中的string 类型占几个字节
- C/C++ 宏详细解析
- 深入分析C++中两个大数相乘结果不正确的问题
- 探讨C++中数组名与指针的用法比较分析
- 深入解析C++中的引用类型
- c语言中malloc、realloc与calloc 的区别以及联系