程序在Turbo C中运行良好,但在MSVC中失败,出现未处理的异常
Program runs good in Turbo C, but fails in MSVC, unhandled exception comes
以下代码构建良好,并在Turbo C++上运行。我在MSVC2010上构建了相同的,它构建时没有错误,但当我运行它(运行时没有调试)时,它显示
gentic.exe 中发生未处理的win32异常
同样在调试过程中,它显示:
genetic.exe中0x00411672处出现未处理的异常:0xC0000005:写入位置0xcccccccc时发生访问冲突。
这发生在我输入行和列之后。。。在*dat2=(double *)malloc(r*sizeof(double*));
(黄色箭头现在指向这些线)
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
class genetic
{
public:
int i,j,m,n;
double **dat2,**dat;
double** createarray(int r,int c)
{ int i;
*dat2=(double *)malloc(r*sizeof(double*));
for(i=0;i<r;i++)
{
dat2[i]=(double*)malloc(c*sizeof(double));
}
return dat2;
}
void input()
{
printf("enter rows n");
scanf("%d",&m);
printf("enter cols n");
scanf("%d",&n);
dat=createarray(m,n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
double val;
scanf("%lf",&val);
dat[i][j]=val;
}
}
}
void output()
{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%3lf ",dat[i][j]);
}
printf("n");
}
}
};
void main()
{
genetic g1;
g1.input();
g1.output();
getch();
}
知道为什么MSVC中会出现这种不同的行为吗?我们该如何解决这个问题?
更新:
根据建议,我改为:
double** createarray(int r,int c)
{ int i;
double **dat2;
dat2=(double *)malloc(r*sizeof(double*));
for(i=0;i<r;i++)
{
dat2[i]=(double*)malloc(c*sizeof(double));
}
return dat2;
}
但我仍然面临问题:
错误1错误C2440:"=":无法从"double"转换为"double*'
此行不正确:
*dat2=(double *)malloc(r*sizeof(double*));
由于您没有为dat2
分配任何内容,因此无法取消引用它。它应该是:
dat2=(double **)malloc(r*sizeof(double*));
此外,由于dat2
不在createarray
函数之外使用,因此最好在其内部进行本地声明。
您需要去掉您引用的行中的第一个*
:
*dat2=(double *)malloc(r*sizeof(double*));
编辑:
应为:
dat2=(double **)malloc(r*sizeof(double*));
或更好:
dat2 = new double*[r];
因为dat2可变对象未初始化,您正在"createarray"中写入其地址。
你可能想用之类的东西
dat2=(double *)malloc(r*sizeof(double*));
发生这种情况的原因如下:
取消引用未序列化的指针是未定义的行为。
Turbo C可以编译"真实模式"程序。在实际模式下,你可以写入一些随机内存位置,在许多(或大多数)情况下,除非你真的很不幸,否则不会立即发生任何明显的事情。
MSVC编译保护模式程序。在保护模式下,大多数访问随机存储器地址的尝试都会使程序崩溃。
此行
*dat2=(double *)malloc(r*sizeof(double*));
在开头有一个额外的CCD_ 9。
执行malloc
时,会得到一个指向新分配内存的void*
(不考虑错误条件)。您正确地将此值强制转换为double*
,然后错误地将该值分配给double
(即*dat2
,意思是"dat2
指向的变量")。相反,您应该将其分配给类型为double*
的变量,即dat2
。
不要对它在TurboC上的工作(意味着它不会崩溃)感到困惑,这纯属偶然。
- 在c++中实现LinkedList时,应出现未处理的错误
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 在C++程序中使用的迭代器中未处理的异常
- 在 ******.exe 中0x00000000772CA267 (ntdll.dll) 处未处理的异常:0xC0000
- 未处理的异常与 cudaMemcpy2D
- 处理未处理的异常更改C++
- for 循环中未处理的异常
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 为什么此代码导致未处理的异常失败
- 瓦尔格林德:注意到但未处理的国际奥克特尔;是否有必要处理以及如何找到?
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 在OpenCV_core310.dll中使用findContours函数时,OpenCV引发未处理的异常
- 0x0F50DF58:0xC0000005:访问冲突读取位置0x0047CA04时未处理的异常
- 使用 getline 时未处理的异常
- 错误 : 异常 : 引发未处理的异常: 读取访问冲突.0xDDDDDDDD临时温度
- Android opencv 3.4.1 Build 命令失败.未定义的引用
- vHRESULT 中未处理的异常失败
- 程序在Turbo C中运行良好,但在MSVC中失败,出现未处理的异常
- 试图在递归函数内部捕获失败的分配:未处理的异常/堆栈溢出