使用strncpy()时缓冲区溢出内存混乱?



作用域:我一直在尝试学习在C中使用strncpy函数时如何发生缓冲区溢出,我发现这确实是不寻常的行为。

我有两个字符数组作为arr1arr2。我试图将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

相关内容

  • 没有找到相关文章

最新更新