免费注册 查看新帖 |

Chinaunix

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

申请二维数组数组出错。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-05 10:27 |只看该作者 |倒序浏览
用下面的方法申请二维数组,在vc和gcc3.4.3下可以得到正确的结果,在gcc3.4.6下Segmentation fault。帮忙看看错在那里。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>



  4. /**********************************************/
  5. #define trigonometric_array(ptr,row,col) (ptr)=alloc_trigonometric_array(#ptr,__FILE__,__LINE__,\
  6.     (row),(col),sizeof(**(ptr)))

  7. #define free_trigonometric free_trigonometric_array(ptr,row,col) free_arry2d( (ptr),(row),(col) )


  8. /************************************************************
  9. 申请一个三角矩阵,有下三角表示
  10. 根据对三角矩阵定义,row必须等于col。
  11. by glf
  12. *************************************************************/
  13. void *alloc_trigonometric_array(char *name,char *file,int line,
  14.                                 unsigned row,unsigned col,unsigned elsize)
  15. {
  16.     void **p;
  17.     unsigned i,j;

  18.     p=NULL;
  19.     if ((row==0)||(col==0)||(elsize==0))
  20.         p=NULL;
  21.     else
  22.     {
  23.         if( row != col)
  24.         {
  25.             printf ("error\n");
  26.             return p;
  27.         }

  28.         if((p=(void **)calloc((size_t)row,(size_t)elsize)) == NULL)
  29.         {
  30.             printf ("error\n");
  31.         }


  32.         for(i=0;i<row;i++)
  33.         {
  34.             if((*(p+i)=(void *)calloc((size_t)(i+1),(size_t)elsize)) == NULL)
  35.             {
  36.                 printf ("error\n");
  37.             }
  38.             j= i+1;
  39.             printf("%3d %3d\n", i, j);
  40.         }
  41.     }

  42.     return p;
  43. }


  44. void free_trigonometric_array(void **p, unsigned row,unsigned col)
  45. {
  46.     unsigned i;

  47.     for(i=0;i<col;i++)
  48.         free(*(p+i));

  49.     free(p);
  50. }



  51. int
  52. main ()
  53. {
  54.     int **array;
  55.     int i,j;

  56.     trigonometric_array (array, 5, 5);


  57.     for (i = 0; i < 5; ++i)
  58.     {
  59.         for (j = 0; j <=i; ++j)
  60.         {
  61.             array[i][j] = i + j;
  62.             printf("%3d ",array[i][j]);
  63.         }
  64.         printf("\n");
  65.     }


  66. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2007-12-05 13:32 |只看该作者
  1. [xujg@centos:~]$gcc test.c
  2. [xujg@centos:~]$./a.out
  3.   0   1
  4.   1   2
  5.   2   3
  6.   3   4
  7.   4   5
  8.   0
  9.   1   2
  10.   2   3   4
  11.   3   4   5   6
  12.   4   5   6   7   8
  13. [xujg@centos:~]$gcc -v
  14. Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.6/specs
  15. Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux
  16. Thread model: posix
  17. gcc version 3.4.6 20060404 (Red Hat 3.4.6-3)
复制代码

论坛徽章:
0
3 [报告]
发表于 2007-12-05 20:54 |只看该作者
这个问题仅仅出现在Dual-Core AMD Opteron(tm) Processor 2214 +RH AS4U4的系统上,在xeon+RHAS4U4就没有问题。 奇怪了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP