主题:C语言缓冲区溢出
sunjunior
[专家分:0] 发布于 2010-09-27 16:59:00
#include <stdio.h>
#include <string.h>
void copy(char *str)
{
char buffer[10];
memset(buffer,0,10);
strcpy(buffer,str);
printf("%s\n",buffer);
}
int main()
{
char s[]="hello world!!!";
copy(s);
return 0;
}
在linux下用GCC编译后运行得到:
$ gcc main.c -Wall
$ ./a.out
hello world!!!
字符串没有被截断,这是什么原因?
回复列表 (共6个回复)
沙发
sponge [专家分:30] 发布于 2010-09-27 23:41:00
C语言的数组是可以越界访问的
板凳
强强 [专家分:4740] 发布于 2010-09-28 12:13:00
[quote]C语言的数组是可以越界访问的[/quote]
错,如果字符串长度超出定义的数组的长度,超出的部分正好覆盖了比较重要的内存,程序会崩溃,最好为你的字符串定义一个足够长度的数组来容纳它
3 楼
sponge [专家分:30] 发布于 2010-09-28 12:22:00
你说的这个和越界访问有什么冲突么?
4 楼
强强 [专家分:4740] 发布于 2010-09-28 13:45:00
越界访问本身就是危险的
5 楼
overfly [专家分:3230] 发布于 2010-09-29 14:22:00
printf("%s\n",buffer);
这句的意思可以这样理解,打印buffer指向的内存,当遇到'\0'时,打印'\n'。
6 楼
bioexplore [专家分:440] 发布于 2010-10-06 10:00:00
问题出在strcpy上,其原型为
char* strcpy(char * destination, const char * source);
其文档中是这样描述的:
Copies the C string pointed by source into the array pointed by destination, including the terminating null character.
To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.
这里指出为了避免内存溢出,必须保证目标字符串指针分配的内存要足够能容纳源字符串指针中的内容包括末尾的\0结束符。
你所提供的代码中buffer分配的内存只有10个字节,而实际传过来的字符串指针指向的字符串占有15个字节,strcpy将直接将这15个字节的内存原封不动的复制到buffer所指向的内存,c语言中的数组并没有越界检查功能,所以这里输出buffer值时将直到字符串结尾的\0才终止。即将整个字符串打出来!
我来回复