请教C语言数组越界问题(数组内结束)
以下程序
void test2()
{
char string, str1;
int i;
for(i=0; i<10; i++)
{
str1 = 'a';
}
strcpy( string, str1 );
}
对试题2,如果面试者指出字符数组str1 不能在数组内结束可以给3 分;如果面试者指出strcpy(string,
str1)调用使得从str1 内存起复制到string 内存起所复制的字节数具有不确定性可以给7 分,在此基
础上指出库函数strcpy 工作方式的给10 分;
以上这个不是很明白 原型声明:extern char *strcpy(char *dest,const char *src);
功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。 本帖最后由 jiaowoxiaolu 于 2012-4-12 17:16 编辑
字符串结尾为 /0
a[]={'1','2','3','4','5']
b[]={"12345"]
l两个数组的长度是不一样的
实际上b数组后面多了一个0
b换成字符表示应该是b[]={'1','2','3','4','5',0}
strcopy函数必须碰到0 才能结束,你那数组结尾后面的内存是不是0谁都不知道。所以复制长度有不确定性 学习了,谢谢楼上两位 str1数组填满了没有字符串结束符 '\0'所以做 strcpy 的时候就有风险,主要是越界查找结束符,引起内存的非法访问。
你可以读一下strcpy 的源代码(来自linux内核) 判断copy结束的唯一标准就是 *dest 指针的值为 0 ,虽然传入的是数组
但是函数当成指针来用的,一直查找下去....
char *strcpy(char *dest, const char *src)
{
char *tmp = dest;
while ((*dest++ = *src++) != '\0')
/* nothing */;
return tmp;
} linux内核 书可以推荐一下吧 我也学习了,觉得有些东西必须的看到本质,才能准确理解呀
页:
[1]