程序在Turbo C中运行良好,但在MSVC中失败,出现未处理的异常 下面的代码非常好地运行,并在Turbo C++上运行。我在MSVC2010上构建了相同的版本,它构建时没有错误,但是当我运行它(运行时没有调试)时,它会显示

程序在Turbo C中运行良好,但在MSVC中失败,出现未处理的异常 下面的代码非常好地运行,并在Turbo C++上运行。我在MSVC2010上构建了相同的版本,它构建时没有错误,但是当我运行它(运行时没有调试)时,它会显示,c++,c,C++,C,gentic.exe中发生未经处理的win32异常 在调试过程中,它还显示: genetic.exe中0x00411672处未处理的异常:0xC0000005: 访问冲突写入位置0xCCCC 这发生在我输入行和列之后。。。在*dat2=(双*)malloc(r*sizeof(双*)(黄色箭头现在指向这些行) #包括 #包括 #包括 阶级遗传 { 公众: int i,j,m,n; 双**dat2,**dat; 双**createarray(整数r,整数c) {int i; *dat2=(双*)ma

gentic.exe中发生未经处理的win32异常

在调试过程中,它还显示:

genetic.exe中0x00411672处未处理的异常:0xC0000005: 访问冲突写入位置0xCCCC

这发生在我输入行和列之后。。。在
*dat2=(双*)malloc(r*sizeof(双*)(黄色箭头现在指向这些行)

#包括
#包括
#包括
阶级遗传
{
公众:
int i,j,m,n;
双**dat2,**dat;
双**createarray(整数r,整数c)
{int i;
*dat2=(双*)malloc(r*sizeof(双*);

对于(i=0;i您需要去掉您引用的行中的第一个
*

*dat2=(双*)malloc(r*sizeof(双*);

编辑:

应该是:

dat2=(double**)malloc(r*sizeof(double*);

或者更好:


dat2=new double*[r];

此行不正确:

    *dat2=(double *)malloc(r*sizeof(double*));
由于您尚未将任何内容分配给
dat2
,因此无法取消对它的引用。它应该是:

    dat2=(double **)malloc(r*sizeof(double*));

另外,由于
dat2
未在
createarray
函数外部使用,因此最好在函数内部本地声明它。

因为dat2变量未初始化,您正在“createarray”中写入它的地址

你可能想用像这样的东西

 dat2=(double *)malloc(r*sizeof(double*));
这就是为什么会发生这种情况:

取消引用未初始化的指针是未定义的行为

Turbo C可以编译“实模式”程序。在实模式下,你可以写入一些随机内存位置,在许多(或大多数)情况下,除非你真的运气不好,否则不会立即发生任何明显的事情

MSVC编译受保护模式的程序。在受保护模式下,大多数尝试访问随机内存地址的程序都会崩溃。

这一行

*dat2=(double *)malloc(r*sizeof(double*));
在开头有一个额外的
*

当您执行
malloc
时,您将得到一个
void*
,结果指向新分配的内存(不考虑错误条件)。您将该值正确地强制转换为
double*
,然后将该值错误地分配给
double
(即
*dat2
,这意味着“由
dat2
”指向的变量。相反,您应该将其分配给类型为
double*
的变量,即
dat2


不要因为它在TurboC上工作(意味着它不会崩溃)而感到困惑,这纯粹是偶然的。

调试器告诉您什么?(不要说您没有使用调试器来逐步检查代码!)
void main
灼伤了我的灵魂。当有完美的现代免费编译器时,没有理由使用Turbo。至少在我看来,这段代码不值得保存。至少在我看来,你应该扔掉你当前的代码,用
std::vector
来存储你的数据。当你这么做的时候,你可能想用
cin
aND<代码> CUT<代码>,请输入“使用”>代码>空的main < /代码>。这不是标准的合法C89或C++。实际上,请不要在使用Turbo时使用Turbo。@克里斯:“没有任何理由使用Turbo。“这有点狭隘。如果你不知何故遇到了旧的C程序,你需要修复它,例如,使用borland图形界面,那么你可能会有一个完美的理由使用Turbo C。在我住的地方,收银机运行FreeDOS,所以这种情况是可能的。好的。但是你能解释为什么吗?我做这件事的时候dat2=(double)malloc(rsizeof(double*))“我得到:错误1错误240:`=”:不能从“双*”到“双**”PaulGriffiths:更好的是,使用<代码> STD::向量< /代码>,因为这是C++,它不再是1995。@ JryycFuin:同意,除了作为一个动态分配手动的练习之外,原始代码的质量表明你不能学习C++中的所有内容。一天之后,代码> STD::向量< /代码>将是最好的选择。我做了双*DAT2;在CeaTeLayRaye()中,仍然有错误1错误C2440:'=:不能从“双*”转换为“双**”。我在答案中固定了C. C++是C还是C++?
 dat2=(double *)malloc(r*sizeof(double*));
*dat2=(double *)malloc(r*sizeof(double*));