+ -
当前位置:首页 → 问答吧 → 错误求救

错误求救

时间:2010-08-01

来源:互联网

本帖最后由 blackgenius 于 2010-08-01 02:06 编辑

自己写一个程序来纯粹为了学习一些函数的使用,结果错误的很奇怪,请论坛里的长老们解解急,看看我的程序为什么错误,要如何改~谢过各位,在线等~
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int eva_rand(int, int, int);

  5. int main(int argc, char* argv[])
  6. {
  7.   int arg1, arg2, arg3;

  8.   if(argc != 4){
  9.     printf("请输入3个参数,第一个是要产生的随机数个数,第二个是正数个数,第三个是要产生的数的位数。\n");
  10.     exit(1);
  11.   }
  12.   arg1 =  atoi(argv[1]);
  13.   arg2 =  atoi(argv[2]);
  14.   arg3 =  atoi(argv[3]);

  15.   eva_rand(arg1, arg2, arg3);
  16.   return 0;
  17. }

  18. int eva_rand(int i, int j, int k) {

  19.   int tnb, pnb;
  20.   long rdi, rdf;
  21.   char crdi[200];
  22.   char crdf[200];
  23.   char ngc[200];
  24.   FILE *fp;
  25.   size_t len;

  26.   tnb = 0;
  27.   pnb = 0;
  28.   bnb = 0;

  29. sprintf(ngc, "-");

  30.   fp = fopen("/tmp/data","w");

  31.   for (; tnb < i && pnb < j; tnb++, pnb++){
  32.     srand(time());
  33.     rdi = rand();
  34.     rdf = rand();
  35.     sprintf(crdi, "%ld", rdi);
  36.     sprintf(crdf, "%ld", rdf);
  37.     len = strlen(crdi);
  38.     if ( len < k){
  39.       continue;
  40.     }
  41.     crdi[k] = '\0';
  42.     crdf[3] = '\0';
  43.     crdf[2] = crdf[1];
  44.     crdf[1] = crdf[0];
  45.     crdf[0] = '.';
  46.     strcat(crdi, crdf);
  47.     fprintf(fp, "%s ", crdi);
  48.     if (!(tnb%5)) {
  49.       fprintf(fp, "\n");
  50.     }
  51.   }
  52.   for (pnb=0 ; tnb < i && pnb < i - j; tnb++, pnb++) {
  53.     srand(time);
  54.     rdi = rand();
  55.     rdf = rand();
  56.     sprintf(crdi, "%ld", rdi);
  57.     sprintf(crdf, "%ld", rdf);
  58.     len = strlen(crdi);
  59.     if ( len < k){
  60.       continue;
  61. }
  62.     crdi[k] = '\0';
  63.     crdf[3] = '\0';
  64.     crdf[2] = crdf[1];
  65.     crdf[1] = crdf[0];
  66.     crdf[0] = '.';
  67.     strcat(crdi, crdf);
  68.     strcat(ngc, crdi);
  69.     fprintf(fp, "%s ", ngc);
  70.     if (!(tnb%5)) {
  71.       fprintf(fp, "\n");
  72.     }
  73.   }
  74.   fclose(fp);
  75.   return 0;
  76. }
复制代码
我运行./a.out 10 5 2得到这么一串提示
*** glibc detected *** ./a.out: double free or corruption (top): 0x09dcf008 ***
======= Backtrace: =========
/lib/libc.so.6[0xa655a5]
/lib/libc.so.6(cfree+0x59)[0xa659e9]
/lib/libc.so.6(fclose+0x136)[0xa53c96]
./a.out[0x8048995]
./a.out[0x8048653]
/lib/libc.so.6(__libc_start_main+0xdc)[0xa11e9c]
./a.out[0x8048511]
======= Memory map: ========
009dd000-009f8000 r-xp 00000000 fd:00 163874     /lib/ld-2.5.so
009f8000-009f9000 r-xp 0001a000 fd:00 163874     /lib/ld-2.5.so
009f9000-009fa000 rwxp 0001b000 fd:00 163874     /lib/ld-2.5.so
009fc000-00b4e000 r-xp 00000000 fd:00 163908     /lib/libc-2.5.so
00b4e000-00b50000 r-xp 00152000 fd:00 163908     /lib/libc-2.5.so
00b50000-00b51000 rwxp 00154000 fd:00 163908     /lib/libc-2.5.so
00b51000-00b54000 rwxp 00b51000 00:00 0
00bd0000-00bd1000 r-xp 00bd0000 00:00 0          [vdso]
065a1000-065ac000 r-xp 00000000 fd:00 163933     /lib/libgcc_s-4.1.2-20080825.so.1
065ac000-065ad000 rwxp 0000a000 fd:00 163933     /lib/libgcc_s-4.1.2-20080825.so.1
08048000-08049000 r-xp 00000000 fd:00 393296     /home/ArmyAnt/src/a.out
08049000-0804a000 rw-p 00000000 fd:00 393296     /home/ArmyAnt/src/a.out
09dcf000-09df0000 rw-p 09dcf000 00:00 0          [heap]
b7fb8000-b7fba000 rw-p b7fb8000 00:00 0
bf938000-bf94d000 rw-p bffea000 00:00 0          [stack]
已放弃

作者: blackgenius   发布时间: 2010-08-01

回复 blackgenius

gdb 调试说我time()函数的地方有问题,所以我指定了一个time值time(0),确实可以排除段错误了,可惜可能我逻辑上有问题,导致生成的data文件里面的数据不对~呵呵

作者: blackgenius   发布时间: 2010-08-01

相关阅读 更多