理想很丰满,现实很骨感。。
代码: 全选
lucifer@DearBaby:~/CC$ cat ReadAll1.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int
main(void)
{
char buf[3];
int i = 1;
int count = 3;
char *p;
while(count == 3)
{
count = read(STDIN_FILENO, buf, 3);
if(count == 3)
{
if(i == 3)
{
p = (char *)malloc(sizeof(char) * 3);
i++;
strcat(p, buf);
continue;
}
else
{
p = realloc(p, sizeof(char) * 3 * i++);
strcat(p, buf);
continue;
}
}
else
{
if(i == 1)
printf("%s", buf);
else
printf("%s", p);
}
}
}
lucifer@DearBaby:~/CC$ cc ReadAll1.c
lucifer@DearBaby:~/CC$ ./a.out
wehflqoiejufljsdv;sd
oie0�juf0�ljs0�dv;0�sd
0�lucifer@DearBaby:~/CC$
之后我用define来使那个3更换为MY_LINE,却输出了一堆东西,而且还不能读取“;”了。这又为什么?
代码: 全选
lucifer@DearBaby:~/CC$ cat ReadAll.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define MY_LINE 3
int
main(void)
{
char buf[MY_LINE];
int i = 1;
int count = MY_LINE;
char *p;
while(count == MY_LINE)
{
count = read(STDIN_FILENO, buf, MY_LINE);
if(count == MY_LINE)
{
if(i == 1)
{
p = (char *)malloc(sizeof(char) * MY_LINE);
i++;
strcat(p, buf);
continue;
}
else
{
p = realloc(p, sizeof(char) * MY_LINE * i++);
strcat(p, buf);
continue;
}
}
else
{
if(i == 1)
printf("%s", buf);
else
printf("%s", p);
}
}
}
lucifer@DearBaby:~/CC$ cc ReadAll.c
lucifer@DearBaby:~/CC$ ./a.out
wehflqoiejufljsdv;sd
*** glibc detected *** ./a.out: realloc(): invalid next size: 0x0000000001821010 ***
======= Backtrace: =========
/lib/libc.so.6[0x7f2a073e8dd6]
/lib/libc.so.6[0x7f2a073ee294]
/lib/libc.so.6(realloc+0xf0)[0x7f2a073ee5f0]
./a.out[0x4006de]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f2a07391abd]
./a.out[0x400599]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:03 675 /home/lucifer/CC/a.out
00600000-00601000 r--p 00000000 08:03 675 /home/lucifer/CC/a.out
00601000-00602000 rw-p 00001000 08:03 675 /home/lucifer/CC/a.out
01821000-01842000 rw-p 00000000 00:00 0 [heap]
7f2a00000000-7f2a00021000 rw-p 00000000 00:00 0
7f2a00021000-7f2a04000000 ---p 00000000 00:00 0
7f2a0715c000-7f2a07172000 r-xp 00000000 08:08 9222 /lib/libgcc_s.so.1
7f2a07172000-7f2a07371000 ---p 00016000 08:08 9222 /lib/libgcc_s.so.1
7f2a07371000-7f2a07372000 r--p 00015000 08:08 9222 /lib/libgcc_s.so.1
7f2a07372000-7f2a07373000 rw-p 00016000 08:08 9222 /lib/libgcc_s.so.1
7f2a07373000-7f2a074d9000 r-xp 00000000 08:08 4436 /lib/libc-2.10.1.so
7f2a074d9000-7f2a076d8000 ---p 00166000 08:08 4436 /lib/libc-2.10.1.so
7f2a076d8000-7f2a076dc000 r--p 00165000 08:08 4436 /lib/libc-2.10.1.so
7f2a076dc000-7f2a076dd000 rw-p 00169000 08:08 4436 /lib/libc-2.10.1.so
7f2a076dd000-7f2a076e2000 rw-p 00000000 00:00 0
7f2a076e2000-7f2a07701000 r-xp 00000000 08:08 4092 /lib/ld-2.10.1.so
7f2a078da000-7f2a078dc000 rw-p 00000000 00:00 0
7f2a078fd000-7f2a07900000 rw-p 00000000 00:00 0
7f2a07900000-7f2a07901000 r--p 0001e000 08:08 4092 /lib/ld-2.10.1.so
7f2a07901000-7f2a07902000 rw-p 0001f000 08:08 4092 /lib/ld-2.10.1.so
7fffe6650000-7fffe6665000 rw-p 00000000 00:00 0 [stack]
7fffe66c5000-7fffe66c6000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
忽略
lucifer@DearBaby:~/CC$ sd
sd: command not found
lucifer@DearBaby:~/CC$