C语言结构体成员指针初始化问题
(一)intmain(){structstudent{char*name;intscore;}stu,*stu1;stu.name="jim";}//此处的student...
(一)
int main()
{
struct student{
char *name;
int score;
}stu, *stu1;
stu.name = "jim";
}//此处的student.name并没有初始化,没有给它用malloc函数分配空间,但是可以赋值成功
----------------------------------------------------------------------------------------------------
(二)
int main()
{
struct student{
char *name;
int score;
struct student* next;
}stu, *stu1;
//stu.name = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/
strcpy_s(stu.name, 5,"jim");
}//此处用stucpy_函数时却提示student.name没有初始化,chuan复制未成功
问题:(一)中的student.name并未初始化,为什么能赋值成功?
(二)偶用strcpy_s函数时有疑问,strcpty(str1,int,str2)中 sizeof(str1)>int&&int>sizeof(str2)才ok? 展开
int main()
{
struct student{
char *name;
int score;
}stu, *stu1;
stu.name = "jim";
}//此处的student.name并没有初始化,没有给它用malloc函数分配空间,但是可以赋值成功
----------------------------------------------------------------------------------------------------
(二)
int main()
{
struct student{
char *name;
int score;
struct student* next;
}stu, *stu1;
//stu.name = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/
strcpy_s(stu.name, 5,"jim");
}//此处用stucpy_函数时却提示student.name没有初始化,chuan复制未成功
问题:(一)中的student.name并未初始化,为什么能赋值成功?
(二)偶用strcpy_s函数时有疑问,strcpty(str1,int,str2)中 sizeof(str1)>int&&int>sizeof(str2)才ok? 展开
3个回答
展开全部
问题:(一)中的student.name并未初始化,为什么能赋值成功?
stu.name = "jim"; "jim"; 是字符串常量,系统自动为他分配了内存并保存这些字符,执行赋值操作是,将这个字符串的首地址复制给 stu.name。
(二)偶用strcpy_s函数时有疑问,strcpty(str1,int,str2)中 sizeof(str1)>int&&int>sizeof(str2)
strcpy_s和strcpy()函数的功能几乎是一样的。strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。在程序运行时,这将导致不可预料的行为。用strcpy_s就可以避免这些不可预料的行为。
这个函数用两个参数、三个参数都可以,只要可以保证缓冲区大小。
三个参数时:
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
两个参数时:
errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource)
例如:
char *str1=NULL;
str1=new char[20];
char str[7];
strcpy_s(str1,20,"hello world");//三个参数
strcpy_s(str,"hello");//两个参数但如果:char *str=new char[7];会出错:提示不支持两个参数
stu.name = "jim"; "jim"; 是字符串常量,系统自动为他分配了内存并保存这些字符,执行赋值操作是,将这个字符串的首地址复制给 stu.name。
(二)偶用strcpy_s函数时有疑问,strcpty(str1,int,str2)中 sizeof(str1)>int&&int>sizeof(str2)
strcpy_s和strcpy()函数的功能几乎是一样的。strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。在程序运行时,这将导致不可预料的行为。用strcpy_s就可以避免这些不可预料的行为。
这个函数用两个参数、三个参数都可以,只要可以保证缓冲区大小。
三个参数时:
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
两个参数时:
errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource)
例如:
char *str1=NULL;
str1=new char[20];
char str[7];
strcpy_s(str1,20,"hello world");//三个参数
strcpy_s(str,"hello");//两个参数但如果:char *str=new char[7];会出错:提示不支持两个参数
展开全部
一中只是将name指向“jim”所在的空间,”jim“已经存在了,直接将指针指向他即可,而二中是复制一个”jim“到name所指向的空间,没有初始化当然不行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一个"jim"返回的是一个地址,是正确的。第二个内存分配小了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询