我正在尝试使用结构来制作某种包含学生姓名、编号等的列表。当我尝试构建解决方案并查看是否有错误时,我的问题是,编译器(Visual Studio 2013)告诉我使用“strcpy_s”而不是“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");
}
最佳答案
由于缓冲区溢出问题,安全不安全问题随之而来。 strcpy
不知道目标字符保存能力。这就是为什么它不安全。
更安全的是strcpy_s(stud.name, 20, "goktug");
。在这里,我们指定无论什么,我们都应该限制在 20 个以内,因为目标能够容纳 20 个字符,包括 NUL 终止字符。
有人可能会争辩说,这里的数据被截断,这并不比目的地太小而无法容纳复制内容的明确消息更好,但肯定比缓冲区溢出漏洞更好。如果我们沿着这条线思考,我们可以得出这样的结论:除非我们确定目的地可以保存复制的字符串,否则我们不应该调用它们。
关于c - 结构不安全警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47971732/