当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 11 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 发现了gcc的一个bug(在用到指针数组和数组指针的时候)
帖子发表于 : 2008-11-02 1:05 

注册: 2008-09-09 17:05
帖子: 31
送出感谢: 0 次
接收感谢: 0 次
我这几天在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)


_________________
菜鸟一个!


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)
帖子发表于 : 2008-11-02 8:57 
头像

注册: 2008-03-23 0:39
帖子: 769
送出感谢: 0 次
接收感谢: 4
gcc -Wall a.c报错


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)
帖子发表于 : 2008-11-02 13:08 

注册: 2008-09-09 17:05
帖子: 31
送出感谢: 0 次
接收感谢: 0 次
不会吧,我这里检查过了啊,没有错误的
我用的命令是:
代码:
gcc name.c


加-Wall 的也试过了,但是返回了:
代码:
$ gcc -Wall out.c
out.c: 在函数‘main’中:
out.c:43: 警告: 在有返回值的函数中,程序流程到达函数尾


不明白了~


_________________
菜鸟一个!


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)
帖子发表于 : 2008-11-02 13:30 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
你这个程序有问题啊, 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;
}


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)
帖子发表于 : 2008-11-02 15:10 

注册: 2008-09-09 17:05
帖子: 31
送出感谢: 0 次
接收感谢: 0 次
谢谢,我知道了,呵呵
但是为什么会在不加printf语句的时候能够返回正确的结果呢?


_________________
菜鸟一个!


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)
帖子发表于 : 2008-11-02 15:11 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
birdcs 写道:
谢谢,我知道了,呵呵
但是为什么会在不加printf语句的时候能够返回正确的结果呢?

因为运气好


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)
帖子发表于 : 2008-11-02 15:15 

注册: 2008-09-09 17:05
帖子: 31
送出感谢: 0 次
接收感谢: 0 次
呵呵~ :em06


_________________
菜鸟一个!


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)
帖子发表于 : 2008-11-02 16:17 
头像

注册: 2008-03-23 0:39
帖子: 769
送出感谢: 0 次
接收感谢: 4
加上Wall报错是因为你的程序最后少了个return 0


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)
帖子发表于 : 2008-11-02 16:23 
头像

注册: 2008-03-23 0:39
帖子: 769
送出感谢: 0 次
接收感谢: 4
birdcs 写道:
谢谢,我知道了,呵呵
但是为什么会在不加printf语句的时候能够返回正确的结果呢?
在代码块内部的变量的缺省存储类型是自动的(automatic)。当程序的执行流离开该代码块时,这些变量便自行销毁。


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)
帖子发表于 : 2008-11-05 10:27 

注册: 2007-12-03 22:53
帖子: 35
送出感谢: 0 次
接收感谢: 0 次
不要动不动就发现bug,尤其是一些十分低级的bug。把自己的基本功打好再说。


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 发现了gcc的一个bug(在用到指针数组和数组指针的时候)
帖子发表于 : 2008-12-07 11:17 

注册: 2008-09-09 17:05
帖子: 31
送出感谢: 0 次
接收感谢: 0 次
wifibt 写道:
不要动不动就发现bug,尤其是一些十分低级的bug。把自己的基本功打好再说。

谢谢指教!


_________________
菜鸟一个!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 11 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译