什么叫【*】指令引用的内存【*】,该内存不能为read解决方法
什么叫【***】指令引用的内存【***】,该内存不能为read
今天学习goto语句,想用goto来编写一个程序,该程序可以按照大小重新排序一个数组的各位数【其中99作为数组的边缘数不予理会】。却怎么都运行不了,请网友看看问题出在哪里,谢了。
下面是报错图片:

------解决方案--------------------
这种程序, 你下个断点F10单步执行, 就能找到错误原因的.
你的问题是:
结束时会越界, 所以总结束不了.
当p指向99,o在执行o++后就越界了, 然后你判断*p>*o就可以成立, 因为越界, 数据是随机的, 一般为一个负数.
解决办法:
你需要把判断条件交换顺序
ceshi:
if(*p==99)
goto end;
if(*o==99)
goto p_zengjia;
if(*p>*o)
goto jiaohuan;
------解决方案--------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
今天学习goto语句,想用goto来编写一个程序,该程序可以按照大小重新排序一个数组的各位数【其中99作为数组的边缘数不予理会】。却怎么都运行不了,请网友看看问题出在哪里,谢了。
#include "stdio.h"
void main()
{
int *p,*o;
int a[10]={5,4,6,7,2,1,3,8,9,99},i;
p=a,o=p++;
ceshi:
if(*p>*o)
goto jiaohuan;
if(*o==99)
goto p_zengjia;
if(*p==99)
goto end;
goto o_zengjia;
jiaohuan:
i=*p;
*p=*o;
*o=i;
goto o_zengjia;
p_zengjia:
p++;
o_zengjia:
o++;
goto ceshi;
end: ;
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
下面是报错图片:
------解决方案--------------------
这种程序, 你下个断点F10单步执行, 就能找到错误原因的.
你的问题是:
结束时会越界, 所以总结束不了.
当p指向99,o在执行o++后就越界了, 然后你判断*p>*o就可以成立, 因为越界, 数据是随机的, 一般为一个负数.
解决办法:
你需要把判断条件交换顺序
ceshi:
if(*p==99)
goto end;
if(*o==99)
goto p_zengjia;
if(*p>*o)
goto jiaohuan;
------解决方案--------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]
srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
b[(a=rand()%11)]=0;
Sleep(100);
b[(a=rand()%11)]=1;
Sleep(100);
b[(a=rand()%11)]=2;
Sleep(100);
b[(a=rand()%11)]=3;
Sleep(100);
b[(a=rand()%11)]=4;
Sleep(100);
}
return 0;
}