for(int ii=0;ii<2;ii++)
{
printf("begin:%d\n", ii);
somefun(&array[ii]);
printf("end:%d\n", ii);
}
ii的值始终是1,从来死循环.一开始我怕是跟全局变量重名,所以把i改成了ii,结果还是一样.
原来,int ii=0;是在for的上面定义的,又听别人的建议,加上C99标准,定义到里面了.
为了测试,这段代码改了一下.
for(int ii=0;ii<2;)
{
printf("begin:%d\n", ii);
int j=somefun(&array[ii]);
printf("end:%d\n", ++ii);
}
加了个int j,ii的值就变了,但不是正常的加了1,而是变成了个非常大的值.循环跳出了.
9 个解决方案
#1
代码
结果
#include <stdio.h>
int main(void)
{
for(int ii=0;ii<2;ii++)
{
printf("begin:%d\n", ii);
// somefun(&array[ii]);
printf("end:%d\n", ii);
}
return 0;
}
结果
$ gcc for.c -std=c99
$ ./a.out
begin:0
end:0
begin:1
end:1
$
//楼主什么情况?那有你说那么诡异呢?
#2
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
VC6:
To set a breakpoint when a variable changes value
1.From the Edit menu, click Breakpoints.
2.Click the Data tab of the Breakpoints dialog box.
3.In the Expression text box, type the name of the variable.
4.Click OK to set the breakpoint.
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
VC6:
To set a breakpoint when a variable changes value
1.From the Edit menu, click Breakpoints.
2.Click the Data tab of the Breakpoints dialog box.
3.In the Expression text box, type the name of the variable.
4.Click OK to set the breakpoint.
#3
C语言能编译通过吗?
#4
问题多半在你函数里面,估计越界了
#5
好像还真是,函数里面也有for循环,给的值小点,外面就正常了,
实在想不通里面为什么会影响外面
#6
查出来了,函数里面用到个结构体,跟原来的定义有些不一样,里面要new 一个handler,原来handler是个指针,现在变成一个指针数组了,就是说每次要new 的其实是handler[i],但现在new成了handler.
但影响到了外面,着实想不通
但影响到了外面,着实想不通
#7
这C语言 编译能通过??
看来我out了。。
看来我out了。。
#8
单步追踪外加打印信息看看吧!很多问题其实不是那么容易就看的出来的!
需要一步一步来的!
#9
VC6:
To set a breakpoint when a variable changes value
1.From the Edit menu, click Breakpoints.
2.Click the Data tab of the Breakpoints dialog box.
3.In the Expression text box, type the name of the variable.
4.Click OK to set the breakpoint.
To set a breakpoint when a variable changes value
1.From the Edit menu, click Breakpoints.
2.Click the Data tab of the Breakpoints dialog box.
3.In the Expression text box, type the name of the variable.
4.Click OK to set the breakpoint.
#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;
}
#1
代码
结果
#include <stdio.h>
int main(void)
{
for(int ii=0;ii<2;ii++)
{
printf("begin:%d\n", ii);
// somefun(&array[ii]);
printf("end:%d\n", ii);
}
return 0;
}
结果
$ gcc for.c -std=c99
$ ./a.out
begin:0
end:0
begin:1
end:1
$
//楼主什么情况?那有你说那么诡异呢?
#2
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
VC6:
To set a breakpoint when a variable changes value
1.From the Edit menu, click Breakpoints.
2.Click the Data tab of the Breakpoints dialog box.
3.In the Expression text box, type the name of the variable.
4.Click OK to set the breakpoint.
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
VC6:
To set a breakpoint when a variable changes value
1.From the Edit menu, click Breakpoints.
2.Click the Data tab of the Breakpoints dialog box.
3.In the Expression text box, type the name of the variable.
4.Click OK to set the breakpoint.
#3
C语言能编译通过吗?
#4
问题多半在你函数里面,估计越界了
#5
好像还真是,函数里面也有for循环,给的值小点,外面就正常了,
实在想不通里面为什么会影响外面
#6
查出来了,函数里面用到个结构体,跟原来的定义有些不一样,里面要new 一个handler,原来handler是个指针,现在变成一个指针数组了,就是说每次要new 的其实是handler[i],但现在new成了handler.
但影响到了外面,着实想不通
但影响到了外面,着实想不通
#7
这C语言 编译能通过??
看来我out了。。
看来我out了。。
#8
单步追踪外加打印信息看看吧!很多问题其实不是那么容易就看的出来的!
需要一步一步来的!
#9
VC6:
To set a breakpoint when a variable changes value
1.From the Edit menu, click Breakpoints.
2.Click the Data tab of the Breakpoints dialog box.
3.In the Expression text box, type the name of the variable.
4.Click OK to set the breakpoint.
To set a breakpoint when a variable changes value
1.From the Edit menu, click Breakpoints.
2.Click the Data tab of the Breakpoints dialog box.
3.In the Expression text box, type the name of the variable.
4.Click OK to set the breakpoint.
#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;
}