免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7381 | 回复: 17
打印 上一主题 下一主题

诡异事情;请指教;代码全有 已解决。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-17 21:05 |只看该作者 |倒序浏览
本帖最后由 wangzhen11aaa 于 2011-11-03 16:37 编辑

我描述一下这个很奇怪的事情: 我在main.c中分配数组然后赋值。如果用make 命令:  会出现会多输入一个数字的问题,而且之后就会出现段错误?!如果我单独编译它,就没有错误,这是怎么回事?
我现在不知道是怎么回事。请教。
代码如下。
  1.                                           
  2. 9  /*这是我测试的一个程序*/
  3. 10 #include<stdio.h>
  4. 11 #include<stdlib.h>
  5. 12 int A[2];
  6. 13 int main()
  7. 14 {
  8. 15         int i;
  9. 16         for (i = 1; i < 2; i++)
  10. 17         scanf("%d", &A[i ])
  11. 18
  12. 19         printf("%p\n", A);
  13. 20         printf("%p\n", &A[1]);
  14. 21
  15. 22         for(i = 1; i < 2; i++)
  16. 23         printf("%d\n", A);
  17. }
复制代码
这里这个程序是测试用的。证明了数组是声明或者定义都会分配内存。
./testshuzu
1
0x80496d8
0x80496dc
1

这里成功了,但是我的另一个小程序却出现了.这是一个排序:我列出所有的文件,

  1.     1 /*      This file is the main.c
  2.       2 */
  3.       3
  4.       4 #include "heap.h"
  5.       5 #include<stdio.h>
  6.       6 #include"heapsort.h"
  7.       7
  8.       8 int heapsize;
  9.       9
  10.     10 int main()
  11.     11 {
  12.     12
  13.     13         int B[11];
  14.     14         int n;
  15.     15         printf("The B's size %d", sizeof (B));
  16.     16
  17.     17         printf("Input the nums that you want to sort \n");
  18.     18         for(n = 1; n < 11; n++)
  19.     19                 scanf("%d \n", &B[n]);
  20.     20         printf("end in scan");
  21.     21         heapsize = Length(B);
  22.     22         printf("The heapsize is %d", heapsize);
  23.     23         Heapsort(B);
  24.     24         printf("The sorted nums are : \n");
  25.     25         for (; n >=1; n--)
  26.     26         printf("%d\n", B[n]);
  27.     27
  28.     28
  29.     29         return 0;
  30.     30 }

复制代码
复制代码

      
    /*This is the heapsort.h*/
      3 #ifndef HEAPSORT_H
      4 #define HEAPSORT_H
      5 #endif
      6
      7 void Heapsort(int A[]);
      8
      9

复制代码

    /*This is the heapify.h*/
      4 #ifndef HEAPIFY_H
      5 #define HEAPIFY_H
      6 #endif
      7
      8 void Max_heapify(int A[], int i);
      9
    10

复制代码

    /*This is the build_max_heap.h*/
    3 #ifndef BUILD_MAX_HEAP_H
      4 #define BUILD_MAX_HEAP_H
      5 #endif
      6 void Build_max_heap(int C[]);
      7

复制代码
[/code]

    1 /*This is the heapsort.c*/
      2 #include"heapsort.h"
      3 #include"heapify.h"
      4 #include"heap.h"
      5 extern int heapsize;
      6 void Heapsort(int A[])
      7 {
      8          int i;
      9          Build_max_heap(A);
    10          for(i = heapsize ; i >= 2; i--)
    11           {
    12                   Exchange(A[1] , A);
    13                 heapsize--;
    14                 Max_heapify(A, 1);
    15           }
    16 }

复制代码

      /*This is the heapify file*/
       1 #include"heap.h"
      2 #include"heapify.h"
      3 extern unsigned int heapsize;
      4 void Max_heapify(int A[],int i)
      5 {
      6         int l, r;
      7         l = Left(i);
      8         r = Right(i);
      9
    10         int largest;
    11         if(l <= heapsize && A[l] > A)
    12                 largest = l;
    13         else
    14                 largest = i;
    15         if ( r <= heapsize && A[r] > A[largest])
    16                 largest = r;
    17         if (largest != i)
    18                 Exchange(A, A[largest]);
    19         Max_heapify(A, largest);
    20 //              return 0;
    21 }

复制代码

    1 #include"heapify.h"
      2 #include"build_max_heap.h"
      3 #include"heap.h"
      4 void Build_max_heap(int C[ ])
      5 {
      6         int i;
      7         for(i = Length(C)>>1; i >= 1; i-- )
      8                 Max_heapify(C, i);
      9 }

复制代码
[/code]

  1. 1
  2.   2 #ifndef HEAP_H
  3.   3 #define HEAP_H
  4.   4 #endif
  5.   5
  6.   6 #define Heap_size(B) (sizeof(B) /sizeof(B[1]) - 1)
  7.   7
  8.   8 #define Length(N)  (sizeof(N) /sizeof(N[1]) - 1)
  9.   9
  10. 10 #define Left(i) i<<1
  11. 11 #define Right(i) ((i<<1)+1)
  12. 12
  13. 13 #define Exchange(x, y)do{\
  14. 14        typeof(int) m = x;   \
  15. 15           x = y;         \
  16. 16           y = m;        \
  17. 17 }while(0)
复制代码
这是makefile文件

    1
      2 object= main.o heapsort.o heapify.o build_max_heap.o
      3 edit : $(object)
      4         cc  -o edit $(object)
      5 main.o :  heapsort.h
      6 #       cc -g -Wall -c main.c
      7 heapsort.o : build_max_heap.h
      8 heapsort.o heapify.o build_max_heap.o : heap.h
      9 #       cc -g -c heapsort.c
    10 #heapify.o:  heap.h
    11 #       cc -g  -c heapify.c
    12 build_max_heap.o heapsort.o: heapify.h
    13 #       cc -g -c build_max_heap.c
    14 .PHONY: clean
    15 clean:
    16         -rm edit $(object)

复制代码

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
2 [报告]
发表于 2011-10-18 09:33 |只看该作者
这个是否要编辑一下啊?里面的内容排版很糟糕啊

论坛徽章:
0
3 [报告]
发表于 2011-10-18 10:10 |只看该作者
呵呵,没太明白你的问题。
make 跟直接gcc编译是一样的啊,makefile只不过是把gcc命令有序组织起来。
如果有段错误的话,大多数是访问越界,指针无效。
用gdb跟一下吧

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2011-10-18 14:25 |只看该作者
我描述一下这个很奇怪的事情: 我在main.c中分配数组然后赋值。如果用make 命令:  会出现会多输入一个数字 ...
wangzhen11aaa 发表于 2011-10-17 21:05



    你第一部分输出本身就有问题的!
  1.   /*这是我测试的一个程序*/
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. int A[2];
  5. int main()
  6. {
  7.          int i;
  8.          for (i = 1; i < 2; i++)
  9.          scanf("%d", &A[i]);

  10.          printf("%p\n", A);
  11.          printf("%p\n", &A[1]);

  12.          for(i = 1; i < 2; i++)
  13.          printf("%d\n", A);
  14. }
复制代码
gcc aa.c -o aa

root@debian:/home/jiangjunyong/program# ./aa
1
0x80496a4
0x80496a8
134518436

这个是直接用gcc编译的结果。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
5 [报告]
发表于 2011-10-18 14:27 |只看该作者
回复 4# dreamice


    这里要特别注意,你前后两次printf输出一次用的是%p,一次用的是%d,实际上结果值是一样的。不太清楚你的结果最后输出怎么会是1.

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2011-10-18 14:29 |只看该作者
你第二部分的测试结果请详细说明一下。没太看明白。

论坛徽章:
0
7 [报告]
发表于 2011-10-18 14:42 |只看该作者
回复 5# dreamice
论坛里
这[]里面的i打不出来。
这个我检查出来了。谢谢大家

论坛徽章:
0
8 [报告]
发表于 2011-10-18 14:43 |只看该作者
回复 3# duanjigang

恩gdb出来了,是因为递归出现死循环越界。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
9 [报告]
发表于 2011-10-18 15:11 |只看该作者
回复  duanjigang

恩gdb出来了,是因为递归出现死循环越界。
wangzhen11aaa 发表于 2011-10-18 14:43



    具体问题还请你辛苦的说明白一下,帮助其他人好理解这个问题。谢谢!
ps:分享经验给你加分

论坛徽章:
0
10 [报告]
发表于 2011-10-18 15:19 |只看该作者
本帖最后由 duanjigang 于 2011-10-18 15:21 编辑

呵呵,建议写程序之前多想想,跟文章一样,腹稿打好了,基本思想成熟了,再码字,就“下笔如有神了”。
我跟人现在经常要求自己(虽然不一定能做到),程序流程,数据结构,算法,大致的划分,都想明白后。再编码。
推荐一篇文章,共勉:
Want to write some code? Get away from your computer!
http://blog.rtwilson.com/want-to ... from-your-computer/


中文翻译地址在此:
http://www.jobbole.com/entry.php/954


最近我认识到一些事情。写代码的最好地方不是在电脑前用你的编译器、集成开发环境和各种工具来写。写代码最好是远离所有这些工具,去到你能够正确思考的地方。你相当熟悉一种语言了,你很容易就能把你心中的程序翻译成编译器可以编译(或解释器可以解释)的程序,不过,难就难在心中形成程序。

  前几天我坐火车去旅行。我带了电脑,但没有网络。很不幸,我正要用一个商业编程语言(碰巧是IDL),为此我得用我们大学的网站许可。由于无法上网,我无法获得网站许可,这样我也就不能运行编译器和集成开发环境。虽然你喜欢商业编程语言,但它需要昂贵的许可,而它那时使我不能用编辑器写代码。那么……想想看是什么…… 到底是什么使我思考!

 编者:IDL-Interactive Data Language,IDL是一种数据分析和图像化应用程序及编程语言,先由美国ITT公司所有。最初在七十年代后期用于帮助科学家分析火星探险卫星发回的数据,将浩瀚的数据转换为图形。从此后,IDL得到广泛运用,使用者日众,呈几何级别增长。IDL用户可以迅速且方便地运用此软件将数据转换为图像,促进分析和理解。通过软件转化的图像既可以是简单色彩,也可以是全色三维图像和模型。),

  我想这篇文章与《 Does Visual Studio Rot the Mind?(Visual Studio 是否使人脑退化?)》中的下面的这句话有点相似:

  我从第一任老板那里学到的最好的一课就是:“如果你的代码无法如你期望的那样运行,不要用调试器(debugger),自己想。”

  那就是离开电脑后迫使你做的事情。人很容易陷入下列的思维模式:

写一些(相当差的)代码
编译和运行
用一个选择不当的测试案例来测试
发现它无法运行
做一些小改动,或许可能解决问题,
重复以上步骤……

  当然这导致最后编写的代码阅读性很差,可能有很多问题,测试通不过。

  离开电脑,迫使你充分调动你头脑里的想法,与用电脑编译和运行代码相比,那会花更多时间(至少对小程序来说是如此……)。因此你不需要做很多小改动和重新运行,你会认真思考代码在做什么。自从计算机A 级考试以来,直到我前几天在火车上这样做的时候,我才第一次在纸上“运行”代码(就是说,写好每个变量的列,并在程序中计算出每个变量的值)。

  就前几天写代码这个例子来说,我在一张纸上写出代码,思考所写的代码,逐步打出一些代码,思考更多,时间长了之后我就尝试用编辑器编辑,设法写出了一些质量高、快速并且无漏洞的代码。最后我把代码(一些涉及很多递归的区域增长图像分割代码)从纸上复制到我的集成开发环境中,第一次就编辑(只有一个句法错误 ——我永生难忘)并运行成功(而且完成了所有我在纸上设计的测试)。

  我认为工作完成得很好,并希望这是一个有用的建议。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP