#include <iostream>
#include <string>
using namespace std;
class student
{
private:
    char name[10];
public:
    student(const char nam[])
    {
        strcpy(name, nam);
    }
    char *get_name(void)
    {
        return name;
    }
};
int main()
{
    student s("hello");
    char *p;
    p = s.get_name();
    cout << p;
    system("pause");
    return 0;
}

会提示strcpy使用有问题改为使用strcpy_s。
解决方法:
1)根据warning,第一个方法,该strcpy为strcpy_s
strcpy_s定义:
errno_t __cdecl strcpy_s(_Out_writes_z_(_SizeInBytes) char Dst, _In rsize_t SizeInBytes, _In_z const char _Src);

注意strcpy_s中多了第二个参数,限制复制字符串的长度,避免越界。
微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。

2)根据warning,第二个方法,To disable deprecation, us _CRT_SCURE_NO_WARNINGS. 找到项目--属性--配置属性--C/C++--命令行--其它选项 中填上【 /D "_CRT_SECURE_NO_DEPRECATE"】(注:中括号中的全部内容)。
或者 在源程序一开始 加上
#pragma warning(disable : 4996)

strcpy_s和strcpy()函数的功能几乎是一样的。strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。在程序运行时,这将导致不可预料的行为。用strcpy_s就可以避免这些不可预料的行为。
这个函数用两个参数、三个参数都可以,只要可以保证缓冲区大小。

另外student类s初始化时hello传递的是一个const char[6],构造函数或者strcpy第二个参数需要的也是指向字符串首地址的常指针。