c - 结构不安全警告

标签 c struct strcpy

我正在尝试使用结构来制作某种包含学生姓名、编号等的列表。当我尝试构建解决方案并查看是否有错误时,我的问题是,编译器(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/

相关文章:

c - 具有多个元素的链表并找到最大的

c - 错误 : lvalue required as left operand of assignment in a swap with pointers

c - printf() 在错误的地方打印换行符

c - 如何在 C 中运行外部程序?

c++ - Class vs Struct 仅用于数据?

C++ 未使用我自己的字符串复制函数按预期打印

将二维数组中的字符组合成C中的字符串

c# - 为什么 Assert.AreEqual(x, y) 会失败,而 Assert.AreEqual(y, x) 不会?

C - 队列未正确存储值

arduino - strcpy() 和/或 strcat() 挂起 Arduino Uno