编译没有错误 但是运行时出现了错误TestQuote.exe 中的 0x00411699 处未处理的异常: 0xC0000005: 写入位置 0x00030f80 时发生访问冲突程序中断后停止在箭头所指向的位置
inline float sqrt(__in float _X)
      ->  {return ((float)sqrt((double)_X)); }#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;int m = 10;
int n = 5;
int _tmain(int argc, _TCHAR* argv[])
{
int ss1 = m;
int ss2 = n;
short **sp;
sp = new short * [ss1];
for(int j=0;j<ss1;j++)
{
       sp[j] = new short [ss2];
}
for(int i = 0;i<ss1;i++)
for(int j = 0;j<ss2;j++)
{
sp[i][j] = i*ss2+j;
sp[i][j] = sqrt((double)sp[i][j]);
cout<<sp[i][j]<<endl; }
for(int i=0;i<ss1;i++)
{
delete [] sp[i];
}
delete sp;
sp = NULL;
return 0;
}

解决方案 »

  1.   

    vs2005  vc6 运行都没错呀
      

  2.   

    应该没问题 要不就是你的sqrt被重载了
      

  3.   

    vc6 
    i在for后i还起作用,
    vs2005 
    i只有在for内才有作用报错就是i的作用域的问题另外
    delete sp;要改成delete [] sp;
      

  4.   

    sp[j] = new short [ss2];//这些内存分配完了却没有验证是否成功?
    sp[i][j] = (short)(sqrt((double)sp[i][j]));再看看有没有错?改成一维的算了,看起来直观多了:short *pTemp = new short[m*n];
    if(!pTemp)
    exit (-1);
    for(int i=0;i<m;i++)
    sp[i] = (pTemp+i*n);//可能不太对哈:)
      

  5.   

    改完之后还是stack overflow的问题
      

  6.   

    stack overflow
    这个是因为无限递归造成stack不够用了仔细检查是不是sqrt()是否无限递归了
      

  7.   

    肯定是sqrt无限递归了,把函数名改一下。
      

  8.   

    你用了math.h就应该避免再用sqrt做自己的名字。
    看你的意思好像是仅仅需要一个返回单精度浮点的平方根,其实你根本没有必要再写一个inline函数,直接
    float x = (float)sqrt();强制类型转换就够用。结果这样搞出来个无限递归调用吧栈都弄垮了。
    看看你的程序
    short **sp;
    sp = new short * [ss1];
    for(int j=0;j<ss1;j++)
    {
      sp[j] = new short [ss2];
    }
    ...
    sp[i][j] = sqrt((double)sp[i][j]);
    费了半天劲搞了个返回单精度浮点的sqrt出来,结果你用的还是short。不觉得不合理么?
      

  9.   


    这个math.h里面的inline函数不是我写的  只是我的程序在运行的时候会出现堆栈溢出的错误,当我选择中断程序的时候,程序的指针就会自动的定位到下面的函数了
    inline float sqrt(__in float _X)
      -> {return ((float)sqrt((double)_X)); }
      

  10.   

    这么说估计是你的VC版本有问题了。我的系统没装2005,在2008里面没有这样的函数定义,只有:
    inline float sqrtf(_In_ float _X)
      {return ((float)sqrt((double)_X)); }
      

  11.   

    楼主没有包含 math.h 或 cmath 的
    所以这个 sqrt 是他自己定义的而非 math 里面的.
    这样写,一看就可以知道是无限的递归.楼主,你里面的那个sqrt,是想调用cmath里的那个吗?
    如果是的话,只要这样写就可以了.
    #include <cmath>inline float sqrt(__in float _X)
    {
    return ::sqrt((double)_X);  //加作用域
    }
      

  12.   

    inline float sqrt(__in float _X) => inline float starnet_sqrt(__in float _X)
    ok~~
      

  13.   

    stack overflow 除了无限递归还真照不出来其他的情况了
      

  14.   

    在另外一个同学的机器上拷过来math.h  beyondcompare对比之后没发现任何不同
      

  15.   

    肯定你自己写的某个sqrt导致问题了,检查以下几个问题:
    1. 确保你工程内部没有定义任何sqrt的宏或者函数
    2. 确保你Addition Include Directories没有加你自己的路径在里面,可以和同学比较一下看看是不是有不同光比较一个math.h没有用的,你还要看诸如stdafx.h里有没有什么东西
      

  16.   

    楼主,你那个代码,在#include<math.h> 的后面,看不到 sqrt 的定义的?
    你是不是在 #include<math.h> 的前面定义 sqrt 的?如果是那样的话,我也试过是无限递归使栈满溢喔.
      

  17.   

    谢谢各位,又看了一下发现math.h库文件被修改了,其他的库文件都显示2005年,只有math.h显示是2010.1.18  谢谢上面的所有人 谢谢