jinbangzhou 发表于 2012-4-12 17:03:49

请教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 分;


以上这个不是很明白

xiaodao35 发表于 2012-4-12 17:14:08

 原型声明:extern char *strcpy(char *dest,const char *src);  
 功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间   
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。   
返回指向dest的指针。

jiaowoxiaolu 发表于 2012-4-12 17:14:20

本帖最后由 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谁都不知道。所以复制长度有不确定性

jinbangzhou 发表于 2012-4-13 08:27:15

学习了,谢谢楼上两位

Etual 发表于 2012-4-13 09:07:06

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;
}

jinbangzhou 发表于 2012-4-13 13:42:05

linux内核 书可以推荐一下吧

tangaoo 发表于 2012-4-21 00:49:21

我也学习了,觉得有些东西必须的看到本质,才能准确理解呀
页: [1]
查看完整版本: 请教C语言数组越界问题(数组内结束)