程序在Turbo C中运行良好,但在MSVC中失败,出现未处理的异常

Program runs good in Turbo C, but fails in MSVC, unhandled exception comes

本文关键字:失败 未处理 异常 MSVC 但在 运行 程序 Turbo      更新时间:2023-10-16

以下代码构建良好,并在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上的工作(意味着它不会崩溃)感到困惑,这纯属偶然。