首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

字符串函数有关问题

2012-03-28 
字符串函数问题,高手请进#includestdlib.h#includestdio.hintmain(void){charc[6]abcde chard[4]

字符串函数问题,高手请进
#include   <stdlib.h>
#include   <stdio.h>
int   main(void)
{
char   c[6]   =   "abcde ";
char   d[4]   =   "ABC ";

strcpy(c,   d);
printf( "%s\n ",   d);

}

运行输出:
ABC  
这个结果能理解

但若把程序改一下,
把       strcpy(c,   d);
printf( "%s\n ",   d);
改成strcpy(d,   c);
printf( "%s\n ",   d);
运行后输出为:
abcde

现在d   中的字符串为abcd,而c   中的字符串为   e0cde0   ,请高手解释一下是什么原因造成的。

[解决办法]
数组d没有足够的 "合法空间 "去存储数组c的内容, strcpy(d, c)会越界copy.

数组越界, 那就是nothing is impossible的事情了.
[解决办法]
char c[6] = "abcde ";
char d[4] = "ABC ";
==》
char c[6] = "abcde ";
char d[6] = "ABC "; //保证足够的空间 !!
[解决办法]
一旦数组越界之后。strcpy函数会继续拷贝 后续字符知道遇到一个\0为止。

由于函数中的c[6]是第一个变量所以也是最后一个出栈的,其前面的一个是d[4],当拷贝了4个字符abcd之后就是e.而刚好此时指针也指向了c 然后继续修改,所以就是e0cde0了

在栈中的布局是这样的(栈是向上生长得)

| |
| |
| |
| d | 占4个字节
| c | 占6个字节
| ^^ |
| RET | 函数的返回地址(这里是main)



[解决办法]
原来 c 中的内容是 "abcde\0 ",d 中的内容是 "ABC\0 ",然后你用 c 覆盖了 d,d 的内容变成了 "abcd ",在输出的时候要一直输出直到遇到 '\0 '字符为止,所以输出自然就是 "abcde "了。

热点排行