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

编译打包和其他
回复
birdcs
帖子: 31
注册时间: 2008-09-09 17:05

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

#1

帖子 birdcs » 2008-11-02 1:05

我这几天在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)
菜鸟一个!
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

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

#2

帖子 ChenFengyuan » 2008-11-02 8:57

gcc -Wall a.c报错
birdcs
帖子: 31
注册时间: 2008-09-09 17:05

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

#3

帖子 birdcs » 2008-11-02 13:08

不会吧,我这里检查过了啊,没有错误的
我用的命令是:

代码: 全选

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

代码: 全选

$ gcc -Wall out.c
out.c: 在函数‘main’中:
out.c:43: 警告: 在有返回值的函数中,程序流程到达函数尾
不明白了~
菜鸟一个!
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

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

#4

帖子 BigSnake.NET » 2008-11-02 13:30

你这个程序有问题啊, 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;
}
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
birdcs
帖子: 31
注册时间: 2008-09-09 17:05

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

#5

帖子 birdcs » 2008-11-02 15:10

谢谢,我知道了,呵呵
但是为什么会在不加printf语句的时候能够返回正确的结果呢?
菜鸟一个!
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

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

#6

帖子 BigSnake.NET » 2008-11-02 15:11

birdcs 写了:谢谢,我知道了,呵呵
但是为什么会在不加printf语句的时候能够返回正确的结果呢?
因为运气好
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
birdcs
帖子: 31
注册时间: 2008-09-09 17:05

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

#7

帖子 birdcs » 2008-11-02 15:15

呵呵~ :em06
菜鸟一个!
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

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

#8

帖子 ChenFengyuan » 2008-11-02 16:17

加上Wall报错是因为你的程序最后少了个return 0
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

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

#9

帖子 ChenFengyuan » 2008-11-02 16:23

birdcs 写了:谢谢,我知道了,呵呵
但是为什么会在不加printf语句的时候能够返回正确的结果呢?
在代码块内部的变量的缺省存储类型是自动的(automatic)。当程序的执行流离开该代码块时,这些变量便自行销毁。
wifibt
帖子: 35
注册时间: 2007-12-03 22:53

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

#10

帖子 wifibt » 2008-11-05 10:27

不要动不动就发现bug,尤其是一些十分低级的bug。把自己的基本功打好再说。
birdcs
帖子: 31
注册时间: 2008-09-09 17:05

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

#11

帖子 birdcs » 2008-12-07 11:17

wifibt 写了:不要动不动就发现bug,尤其是一些十分低级的bug。把自己的基本功打好再说。
谢谢指教!
菜鸟一个!
回复