字符串函数问题,高手请进
#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 "了。