作用域:我一直在尝试学习在C中使用strncpy
函数时如何发生缓冲区溢出,我发现这确实是不寻常的行为。
我有两个字符数组作为arr1
和arr2
。我试图将20字节的数据从arr1
(大小为16的数组)移动到大小为5的arr2
。根据我的理解,这应该触发缓冲区溢出,但我发现arr2
中存储的字符串长度增加以容纳字符串,但数组的大小保持不变。
#include<stdio.h>
#include<string.h>
int main(){
char arr1[]="Buffer overflow";
char arr2[5];
printf("Size of array1 %dn",sizeof(arr1));
strncpy(arr2,arr1,20);
printf("nAfter copyn");
printf("Length of arr2: %dn",strlen(arr2));
printf("Size of arr2: %dn",sizeof(arr2));
printf("Arr2: %sn",arr2);
return 0;
}
我发现下面的输出非常令人惊讶,
Size of array1 16
After copy
Length of arr2: 15
Size of arr2: 5
Arr2: Buffer overflow
:arr2
的大小只有5,arr2
的长度怎么可能是15,arr2
的大小为5,怎么能容纳另一个字符数组的大小为20 ?
程序有未定义的行为,因为这个调用
strncpy(arr2,arr1,20);
覆盖字符数组arr2
以外的内存。该函数不知道数组arr2
的大小。(请记住,用作函数参数的数组arr2
被隐式转换为指向其第一个元素的指针。)它相信函数的调用者正确地指定了复制字符的数量。保证函数的正确工作是函数调用者的责任。
数组的大小没有改变,这个输出确认
Size of arr2: 5
这叫
printf("Length of arr2: %dn",strlen(arr2));
不输出数组arr2
的大小。输出复制的字符串"Buffer overflow"
的长度。
请注意,您必须对类型为size_t
的对象使用转换说明符%zu
,而不是转换说明符%d
。