要疯掉了!
程序目的:
很简单,读取当前的"read.txt"中的内容,把第一行与最末一行整体交换内容。然后另存到另一文件"write.txt"中。
比如:在read.txt中有:
aaa
bbbb
ccccc
dddddd
eeeeeee
交换之后就应该:
eeeeeee
dddddd
ccccc
bbbb
aaa
然后保存到write.txt
我的代码是:
#include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4
5 #define MAXNUM 20 //假设最多可处理20行,每行20个字符的数据段落
6 void putErrMessage(char *);
7 void putErrMessage(char *EMessage)
8 {
9 printf("Error happened,which is %s\n",EMessage);
10 exit(2);
11 }
12
13 int main()
14 {
15 FILE *fp_R;
16 FILE *fp_W;
17 char (*Buffer)[20];
18 Buffer=(char (*)[20])malloc(sizeof(char *)*20);
19 char temp[11];
20 memset(temp,'0',10);
21 int row=0,i=0,j=0;
22 int length=0;
23 if((fp_R=fopen("read.txt","r"))==NULL)
24 {
25 putErrMessage("Read Error");
26 }
27 if((fp_W=fopen("write.txt","w"))==NULL)
28 {
29 putErrMessage("Write Error");
30 }
31 while(fgets(temp,MAXNUM,fp_R)!=NULL)
32 {
33 strcpy(*(Buffer+row),temp);
34 row++;
35 }
36 for(i=row-1;i>=0;i--)
38 {
39 fprintf(fp_W,"%s",*(Buffer+i));
40 printf("%s",*(Buffer+i));
41 }
42
43 printf("OK2\n");
44
45 if(Buffer!=NULL)
46 {
47 for(i=0;i<20;i++)
48 free(*(Buffer+i));
49 free(Buffer);
50 }
51 printf("OK3\n");
52
53 if(fclose(fp_R)||fclose(fp_W))
54 {
55 putErrMessage("Close Error");
56 }
57 return 0;
58
59 }
但是,输出却是:
eeeeeee
$��dddddd
ccccc
bbbb
aaa
OK2
*** glibc detected *** ./test: free(): invalid next size (normal): 0x0960f008 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7efd454]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7eff4b6]
./test[0x8048888]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7ea4685]
./test[0x80485e1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:07 123111 /home/duyingkun/test
08049000-0804a000 r--p 00000000 08:07 123111 /home/duyingkun/test
0804a000-0804b000 rw-p 00001000 08:07 123111 /home/duyingkun/test
0960f000-09630000 rw-p 0960f000 00:00 0 [heap]
b7d00000-b7d21000 rw-p b7d00000 00:00 0
b7d21000-b7e00000 ---p b7d21000 00:00 0
b7e70000-b7e7d000 r-xp 00000000 08:07 180531 /lib/libgcc_s.so.1
b7e7d000-b7e7e000 r--p 0000c000 08:07 180531 /lib/libgcc_s.so.1
b7e7e000-b7e7f000 rw-p 0000d000 08:07 180531 /lib/libgcc_s.so.1
b7e8d000-b7e8e000 rw-p b7e8d000 00:00 0
b7e8e000-b7fe6000 r-xp 00000000 08:07 197601 /lib/tls/i686/cmov/libc-2.8.90.so
b7fe6000-b7fe8000 r--p 00158000 08:07 197601 /lib/tls/i686/cmov/libc-2.8.90.so
b7fe8000-b7fe9000 rw-p 0015a000 08:07 197601 /lib/tls/i686/cmov/libc-2.8.90.so
b7fe9000-b7fed000 rw-p b7fe9000 00:00 0
b7ff8000-b7ffc000 rw-p b7ff8000 00:00 0
b7ffc000-b8016000 r-xp 00000000 08:07 180236 /lib/ld-2.8.90.so
b8016000-b8017000 r-xp b8016000 00:00 0 [vdso]
b8017000-b8018000 r--p 0001a000 08:07 180236 /lib/ld-2.8.90.so
b8018000-b8019000 rw-p 0001b000 08:07 180236 /lib/ld-2.8.90.so
bfe03000-bfe18000 rw-p bffeb000 00:00 0 [stack]
Aborted
我的问题是:
(1)“dddddd”前面的乱码是怎么出来的?怎样改过来?
(2)第19行我用的是数组来作临时数据用的,可否用指针来完成相似的功能?(请看题目中的功能)
(3) 后面的内存泄露的错误好像是由于free二维指针时发生的。这个错误如何改正?如何释放二维指针中的数据?
请 逐一进行讲解,不要含含糊糊!谢谢!