一个指针的问题,通过编译器调用正常,直接运行报错(增加问题描述)

aquayhy 2017-02-18 09:41:04
下面的代码在windows下用dev-cpp编译通过,如果直接用dev-cpp的“运行程序”就一切正常,但在cmd窗口运行跑到某一行就报错(已经尝试分别用管理员账号和guest账号运行cmd,均出错)。
错误代码如下:
问题事件名称: APPCRASH
应用程序名: gauss_devcpp.exe
应用程序版本: 0.0.0.0
应用程序时间戳: 58a7a2f0
故障模块名称: gauss_devcpp.exe
故障模块版本: 0.0.0.0
故障模块时间戳: 58a7a2f0
异常代码: c0000005
异常偏移: 00034fb7
OS 版本: 6.1.7601.2.1.0.256.1
区域设置 ID: 2052
其他信息 1: 0a9e
其他信息 2: 0a9e372d3b4ad19135b953a78882e789
其他信息 3: 0a9e
其他信息 4: 0a9e372d3b4ad19135b953a78882e789

\
   ldouble *rval;
ldouble *temp = (ldouble *)calloc( 2 * size * size, sizeof( ldouble));
ldouble *tptr = temp;
ldouble *tptr1, *tptr2;
/*
这里有一大段复杂的计算……
*/
rval = (ldouble *)calloc( size * size, sizeof( ldouble));
if( rval) /* copy the right-hand half of 'temp', which */
{
/* now has the inverse we wanted */
double xxx;
tptr1 = rval;
for( i = 0; i < size; i++)
for( j = 0; j < size; j++)
{
*tptr1++=temp[(i * 2 + 1) * size + j]; //运行到这句出错,后来为了验证,我改成下面的写法


xxx= temp[(i * 2 + 1) * size + j];
*tptr1= xxx;// 这句出错
tptr1++;

}
}


我完全不明白为什么,而且并不是空间不足,是第一次运行进循环就出错。
...全文
192 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
aquayhy 2017-02-18
  • 打赏
  • 举报
回复
引用 2 楼 zzmlake 的回复:
*tptr1= xxx;// 这句出错 估计是tptr1指向的地址不可访问,非法。 建议你用printf("%p\n", tptr1);输出地址看看。 你这代码不全,没法明确判断
rval = (ldouble *)calloc( size * size, sizeof( ldouble)); if( rval) tptr1 = rval; 这3行是说明这个地址应该没有问题。 刚刚测试了半天出现更加诡异的问题。 在调用该函数前的一段代码加上调试语句 printf("1\n"); 一段代码 printf("2\n"); 一段代码 printf("3\n"); *tptr1= xxx; printf("4\n"); 运行程序出现 1 2 3 崩溃 如果把 printf("1\n"); printf("2\n"); 全部删掉,则直接崩溃, 3这行也看不到,就是说理论上完全没有用的printf("1\n");也会影响程序是否出错,我猜是某些随机操作,比如分配内存之类的出现问题,但是我没有办法调试。 目前能想到的解决办法是下午换个编译器试试。
zzmlake 2017-02-18
  • 打赏
  • 举报
回复
*tptr1= xxx;// 这句出错 估计是tptr1指向的地址不可访问,非法。 建议你用printf("%p\n", tptr1);输出地址看看。 你这代码不全,没法明确判断
aquayhy 2017-02-18
  • 打赏
  • 举报
回复
刚刚增加了测试数据,经过测试,发现无论是通过编译器调用还是通过cmd窗口运行,一样在*tptr1= xxx;会出错,有没有人有经验,在这种情况出错的原因是什么?
aquayhy 2017-02-18
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
尝试了一下,出现这个 线程 'Win32 线程' (0x2854) 已退出,返回值为 0 (0x0)。 gauss_devcpp.exe 中的 0x00435193 处未处理的异常: 0xC0000005: 读取位置 0xffffffff 时发生访问冲突 还是完全看不懂。 我刚刚找了一个codeblock,重新编译了一下,这次很顺利的把程序跑完了,没有出现那个奇怪的问题。 编译器devcpp背锅了吧
赵4老师 2017-02-18
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
幻夢之葉 2017-02-18
  • 打赏
  • 举报
回复
重点看你那一大段代码有没有对temp直接或间接的内存指向重新修改 printf()是可能对崩溃点造成影响的 经典的情况是在一个函数内打印,然后返回局部的指针或者引用,最后在调用处打印返回结果,那么就可能并不会崩溃

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧