C语言问题,段错误,求高手指教,感激不尽。
这是编程珠玑第一章中自己做的作业,我不知道为什么在vc6.0中运行加上末尾 printf("");就会运行出错,而在linux系统中加上末尾printf(""); 这句不会出错,但是加上printf("i = %d ",i)这句会出现段错误,我感到莫名奇妙,为什么不能访问变量i呢 ????
#include <stdio.h>
#define N 488 //488不会出现段错误,489就会出现段错误????
#define SHIFT 5 //32 位机
#define MASK 0xffffffff //32 位机
/*******
一个int型有32个位
********/
unsigned int a[N/SHIFT];
void clr_bit(int i)
{
a[i>>SHIFT] &= ~(1<<i); //给该位清0
}
void set_bit(int i)
{
a[i>>SHIFT] |= (1<<i);
}
int test_bit(int i)
{
return a[i>>SHIFT] & (1<<i);
}
int main()
{
int i;
for (i = 0; i < N; i++)
{
a[i] = MASK;
}
for (i = 0; i < N; i++)
{
clr_bit(i);
printf("a[%d] = %x ",i>>SHIFT,a[i>>SHIFT]);
}
for (i = 0; i < N; i++)
{
set_bit(i);
}
printf("a[0] = %x \n",a[0]);
for (i = 0; i < N; i++)
{
if (test_bit(i))
{
printf("a[%d] = %x ",i>>SHIFT,a[i>>SHIFT]);
printf("OK\n");
//printf("%d ",i>>SHIFT);
}
}
//printf("");
//printf("i = %d ",i);
return 0;
}
[解决办法]
printf处理的时候:
00402ABC |. 8A44C1 04 MOV AL,BYTE PTR DS:[ECX+EAX*8+4]
引发异常了。
但我这里不能重现LZ说的问题,如果程序代码没问题,那多半是环境问题,只好靠LZ自己调试了,也可以先不管它,先换个环境试试。
[解决办法]
只找出一项不符合标准的地方,就是1<<i,标准规定i大于等于左操作数长度,其结果是未定义的。而且i的值也不能为负数。楼主在对1进行左移前把i截断为31以内的非负数吧。如:i &= 31;
参见《C语言参考手册》第五版邱仲潘等译第166页。
你的数组是97个无符数,关于清除与测试的函数传入的值在进行移位(i>>SHIFT)后不超15,所以不会越界。
cygwin gcc 4.5.3 for xp没有问题。
楼主在最后printf("")不加换行符"\n"刷新输出流真是急死人。
希望对你有用。