分页: 1 / 1

发现了gcc的一个bug(在用到指针数组和数组指针的时候)

发表于 : 2008-11-02 1:05
birdcs
我这几天在linux环境下利用gcc写一个小程序,是关于如何直接写入一个数组并打印输出刚刚输入的这个数组。
于是发现了这个bug,请大家聊聊,看看是不是bug,或者是我的程序有错误。
源程序如下:

代码: 全选

#include<stdio.h>

int *Scanf(int i){//这是数组输入函数
	int *p,m[10];
	switch(i){
		case 1:scanf("%d",&m[0]);break;	
		case 2:scanf("%d %d",&m[0],&m[1]);break;	
		case 3:scanf("%d %d %d",&m[0],&m[1],&m[2]);break;	
		case 4:scanf("%d %d %d %d",&m[0],&m[1],&m[2],&m[3]);break;	
		case 5:scanf("%d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4]);break;	
		case 6:scanf("%d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5]);break;	
		case 7:scanf("%d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6]);break;	
		case 8:scanf("%d %d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6],&m[7]);break;
		case 9:scanf("%d %d %d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6],&m[7],&m[8]);break;	
		case 10:scanf("%d %d %d %d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6],&m[7],&m[8],&m[9]);break;	
	}
	p=m;
	return p;
}
void Printf(int i,int *p){//这是数组输出函数
	switch(i){
		case 1:printf("%d\n",*p);break;
		case 2:printf("%d %d\n",*p,*(p+1));break;
		case 3:printf("%d %d %d\n",*p,*(p+1),*(p+2));break;
		case 4:printf("%d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3));break;
		case 5:printf("%d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4));break;
		case 6:printf("%d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5));break;
		case 7:printf("%d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6));break;
		case 8:printf("%d %d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),*(p+7));break;
		case 9:printf("%d %d %d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),*(p+7),*(p+8));break;
		case 10:printf("%d %d %d %d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),*(p+7),*(p+8),*(p+9));break;
	}
	printf("\n");
}

int main(){
	int i;
	int *p;
	scanf("%d",&i);
	p=Scanf(i);
//	printf("所输入的数组为:");
	Printf(i,p);
}
源程序是可以无任何错误地通过gcc命令编译,而且可以返回预期的结果。
但请注意main函数中被注释掉的一行,当去掉注释符号的时候,虽然可以无错误地通过编译,但结果却不是预期的。

我编的函数需要用到数组的直接输入和输出,因此已经挣扎了两个晚上了,希望有人能指点一下。
我的gcc版本是 4.2.4 (Ubuntu 4.2.4-lubuntu3)

Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)

发表于 : 2008-11-02 8:57
ChenFengyuan
gcc -Wall a.c报错

Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)

发表于 : 2008-11-02 13:08
birdcs
不会吧,我这里检查过了啊,没有错误的
我用的命令是:

代码: 全选

gcc name.c
加-Wall 的也试过了,但是返回了:

代码: 全选

$ gcc -Wall out.c
out.c: 在函数‘main’中:
out.c:43: 警告: 在有返回值的函数中,程序流程到达函数尾
不明白了~

Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)

发表于 : 2008-11-02 13:30
BigSnake.NET
你这个程序有问题啊, m[] 是局部变量, 怎么可以返回 m 呢

应该这样 。。

代码: 全选

#include<stdio.h>

int *Scanf(int i, int m[]){//这是数组输入函数
   // 暂时忽视 m 的溢出问题...
   // int *p,m[10];
   switch(i){
      case 1:scanf("%d",&m[0]);break;
   }
   // p=m;
   return m;
}
void Printf(int i,int *p){//这是数组输出函数
   switch(i){
      case 1:printf("%d\n",*p);break;
   }
   printf("\n");
}

int main(){
   int i;
   int m[10];
   int *p;
   scanf("%d",&i);
   p=Scanf(i, m);
   printf("所输入的数组为:");
   Printf(i,p);
   return 0;
}

Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)

发表于 : 2008-11-02 15:10
birdcs
谢谢,我知道了,呵呵
但是为什么会在不加printf语句的时候能够返回正确的结果呢?

Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)

发表于 : 2008-11-02 15:11
BigSnake.NET
birdcs 写了:谢谢,我知道了,呵呵
但是为什么会在不加printf语句的时候能够返回正确的结果呢?
因为运气好

Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)

发表于 : 2008-11-02 15:15
birdcs
呵呵~ :em06

Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)

发表于 : 2008-11-02 16:17
ChenFengyuan
加上Wall报错是因为你的程序最后少了个return 0

Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)

发表于 : 2008-11-02 16:23
ChenFengyuan
birdcs 写了:谢谢,我知道了,呵呵
但是为什么会在不加printf语句的时候能够返回正确的结果呢?
在代码块内部的变量的缺省存储类型是自动的(automatic)。当程序的执行流离开该代码块时,这些变量便自行销毁。

Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)

发表于 : 2008-11-05 10:27
wifibt
不要动不动就发现bug,尤其是一些十分低级的bug。把自己的基本功打好再说。

Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)

发表于 : 2008-12-07 11:17
birdcs
wifibt 写了:不要动不动就发现bug,尤其是一些十分低级的bug。把自己的基本功打好再说。
谢谢指教!