C 语言没有字符串的数据类型,处理起来不那么简单,容易发生越界错误。例子如下:
#include <stdio.h> #include <string.h> void main() { const char *a="a"; const char *b="ab"; char d[10]; // strcpy(d,a); strcat(d,a); strcat(d,b); printf("%s\n",d); }
这个例子运行结果是出错,单步跟踪调试,发现 strcpy() 语句前后:
变量
+ d 0x0012ff6c "烫烫烫烫烫烫 B"
+ b 0x00422020 "ab"
+ a 0x00422024 "a"
+ d 0x0012ff6c "烫烫烫烫烫烫 Ba"
+ b 0x61422020 ""
+ a 0x00422000 ""
+ b 0x00422020 "ab"
+ a 0x00422024 "a"
+ d 0x0012ff6c "烫烫烫烫烫烫 Ba"
+ b 0x61422020 ""
+ a 0x00422000 ""
内存
0012FF6C
CC CC CC CC CC CC CC CC CC CC CC CC
20 20 42 00
24 20 烫烫烫烫烫烫 B.$
0012FF7E 42 00 C0 FF 12 00
0012FF6C CC CC CC CC CC CC CC CC CC CC CC CC 20 20 42 61 00 20 烫烫烫烫烫烫 Ba.
0012FF7E 42 00 C0 FF 12 00
0012FF7E 42 00 C0 FF 12 00
0012FF6C CC CC CC CC CC CC CC CC CC CC CC CC 20 20 42 61 00 20 烫烫烫烫烫烫 Ba.
0012FF7E 42 00 C0 FF 12 00
- 其中:
- 红色部分,变量 d 的地址,本来定义了 10 个字节的长度,实际分配时,按照 4 的倍数分配,所以是 12 字节
- 20 20 42 00 为变量 b 的地址,低位在前
- 24 20 42 00 为变量 a 的地址,低位在前
- 因为都是局部变量,所以在栈上分配临时存储空间
- 加上 strcpy() 后运行正常
- 对局部变量的操作,实际上是对栈进行操作
strcpy() 源代码
char* strcpy(char * dst, const char * src) { char * cp = dst; while( *cp++ = *src++ ) return( dst ); }
strcat() 源代码
char* strcat ( char * dst , const char * src ) { char * cp = dst; while( *cp ) cp++; while( *cp++ = *src++ ) ; return( dst ); }
strcmp() 源代码
int strcmp ( const char* src, const char* dst ) { int ret = 0 ; while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) ++src, ++dst; if ( ret < 0 ) ret = -1 ; else if ( ret > 0 ) ret = 1 ; return( ret ); }