我正在尝试使用struct来制作一些带有学生姓名,编号等的列表。当我尝试构建解决方案并查看是否存在错误时,我的问题,编译器(Visual Studio 2013)告诉我使用“strcpy_s”intead“strcpy”。当我修复它这次我得到与字符串字符串大小相关的错误。我究竟做错了什么?
#include <stdio.h>
#include<string.h>
struct student
{
char name[20];
char surname[20];
char dep[50];
int Class;
int num;
}stud;
main(void){
strcpy(stud.name, "goktug");
strcpy(stud.surname, "saray");
strcpy(stud.dep, "elektrik");
}
答案 0 :(得分:3)
由于缓冲区溢出问题,安全性不安全的问题即将到来。 strcpy
不知道目的地characeter持有能力。这就是为什么它不安全。
更安全的是strcpy_s( stud.name, 20, "goktug" );
。在这里我们指定无论我们应该在20的限制,因为destnation能够容纳20个字符,包括NUL终止字符。
有人可能会争辩说,这里的数据被截断了,这并不比明确的消息更好,因为目标太小而无法保存复制的东西,但肯定比缓冲区溢出漏洞更好。如果我们顺便考虑那条线,我们可以得出这样的结论:除非我们确定目的地可以保存复制的字符串,否则我们不应该调用它们。