C语言编的程序编译没有错误,运行时出现unhandled exception in xx.exe 0xC000005:Access Violation

蜗sn牛 2016-06-13 10:20:50

typedef struct DCOMPLEX {
double re;
double im;
}dcomplex;

dcomplex *transmittedSeq = NULL;
transmittedSeq = (dcomplex *) malloc(SYMBOLLEN*sizeof(dcomplex));
if(transmittedSeq == NULL)
{
printf("transmittedSeq 分配内存失败!");
exit(1);
}

void modulator(int *encoded_bit, int *m_pSignalMapper, dcomplex *m_pSignal,dcomplex *signalSeq, int *randSeq)
{

int label, m;

for(int i = 0; i < SYMBOLLEN; i++)
{
randSeq[i] = rand() % ConstellationSize;
for(label = 0, m = 0; m < MODULATION_TYPE; m++)
label = (label<<1) + (int)encoded_bit[(i+1)*MODULATION_TYPE-m-1];
label = label ^ randSeq[i];
int index = m_pSignalMapper[label];
signalSeq[i] = m_pSignal[index];
}
}

当运行程序时,在modulator函数内运行没有错误,但是运行完函数后出现unhandled exception in xx.exe 0xC000005:Access Violation,查看汇编时标记到:add esp, 4 ;麻烦各位帮忙看下
...全文
541 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-06-13
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 尽量将代码贴全。
蜗sn牛 2016-06-13
  • 打赏
  • 举报
回复
引用 1 楼 lianshaohua 的回复:
运行完这个函数后你做了什么操作?
channel函数:

void channel(dcomplex *ricianSeq, dcomplex *signalSeq, double sigma)
{

    dcomplex temp;
    double nc, ns;
    for(int i = 0; i < SYMBOLLEN; i++)
    {
        ricianSeq[i] = rician_distribution();
        ComplexGauss(sigma, &nc, &ns);
        temp = cMult(ricianSeq[i], signalSeq[i]);
        signalSeq[i].re = temp.re + nc;
        signalSeq[i].im = temp.im + ns;
    }
}
蜗sn牛 2016-06-13
  • 打赏
  • 举报
回复
把修改后的signalSeq作为参数被channel函数调用; void channel(dcomplex *ricianSeq, dcomplex *signalSeq, double sigma);
ztenv 2016-06-13
  • 打赏
  • 举报
回复
运行完这个函数后你做了什么操作?
蜗sn牛 2016-06-13
  • 打赏
  • 举报
回复
引用 6 楼 qq423399099 的回复:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

单步,设断点都尝试过了,还是没有找到问题所在
for(int i = 0; i < SYMBOLLEN; i++)
{
randSeq[i] = rand() % ConstellationSize;
for(label = 0, m = 0; m < MODULATION_TYPE; m++)
label = (label<<1) + (int)encoded_bit[(i+1)*MODULATION_TYPE-m-1];
label = label ^ randSeq[i];
int index = m_pSignalMapper[label];
signalSeq[i] = m_pSignal[index];
}

执行完这个循环后程序里吗就出现
call stack 中提示:NTDLL! 775315ee(), 然后汇编跳到:775315EE add esp, 4
小灸舞 版主 2016-06-13
  • 打赏
  • 举报
回复
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
蜗sn牛 2016-06-13
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 尽量将代码贴全。
完整代码太长了,我试下,谢谢

70,023

社区成员

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

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