strcat函数中while语句下的NULL;
编译环境是 ubuntu下的gcc.
代码如下:
/*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//strcat
char *strcat(char *s1,const char*s2)
{
assert((s1!=NULL) && (s2!=NULL));
char *addr=s1;
while(*s1 !='\0')
{
s1++;
}
/***
while(*s1++ !='\0') is wrong
when s1=='\0',it will still ++
****/
while((*s1++ = (char *)*s2++)!='\0')
!!!NULL;
/*注释掉 NULL; 并且不再while语句后面加分号,结果正确。*/
return addr;
}
main()
{
char ss1[]="123456789";
char ss2[]="abcde";
char *s1=ss1;
char *s2=ss2;
char *addr=s1;
s1=strcat(s1,s2);
while(*s1!='\0')
{
printf("%c ",*s1++);
}
printf("\n");
}//
/*****************************************************************************/
问题:
当不注释掉 NULL;(!!!那行),运行结果是:
1 2 3 4 5 6 7 8 9 a b c d e
*** stack smashing detected ***: ./b terminated
======= Backtrace: =========
/lib/libc.so.6(__fortify_fail+0x50)[0xe9f980]
/lib/libc.so.6(+0xe592a)[0xe9f92a]
./b[0x80485bd]
/lib/libc.so.6(__libc_start_main+0xe7)[0xdd0ce7]
./b[0x8048401]
======= Memory map: ========
003ee000-0040a000 r-xp 00000000 08:01 1966101 /lib/ld-2.12.1.so
0040a000-0040b000 r--p 0001b000 08:01 1966101 /lib/ld-2.12.1.so
0040b000-0040c000 rw-p 0001c000 08:01 1966101 /lib/ld-2.12.1.so
00801000-0081b000 r-xp 00000000 08:01 1966159 /lib/libgcc_s.so.1
0081b000-0081c000 r--p 00019000 08:01 1966159 /lib/libgcc_s.so.1
0081c000-0081d000 rw-p 0001a000 08:01 1966159 /lib/libgcc_s.so.1
注释掉之后,正常:
nid@ubuntu:~$ ./b
1 2 3 4 5 6 7 8 9 a
求知,为何NULL这个影响如此之大?还是另有原因??
[解决办法]
你把NULL当成一条语句来用了,结果不可预料。