-4

以下代码构建得非常好,并在 Turbo C++ 上运行。我在 MSVC2010 上构建了相同的,它构建没有错误,但是当我运行它(运行没有调试)时,它显示

gentic.exe 中出现未处理的 win32 异常

同样在调试期间它显示:

generic.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 * '

4

4 回答 4

4

此行不正确:

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

由于您没有为 分配任何内容dat2,因此您无法取消引用它。它应该是:

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

此外,由于dat2不在createarray函数外部使用,因此最好在其中本地声明它。

于 2013-07-16T04:12:36.720 回答
1

你需要去掉*你引用的行中的第一个:

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

编辑:

应该:

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

或更好:

dat2 = new double*[r];

于 2013-07-16T04:11:35.780 回答
0

因为 dat2 变量未初始化,并且您正在“createarray”中写入其地址。

你可能想使用类似的东西

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

这就是它发生的原因:

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

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

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

于 2013-07-16T04:14:58.780 回答
0

这条线

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

*开头有一个额外的。

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

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

于 2013-07-16T04:18:44.837 回答