C语⾔strcpy()函数的崩溃探索
先看⼀个代码:
#include <stdio.h>
#include <string.h>
typedef struct T
{
molloc函数char *name;
int num;
}test;
int main()
{
test *p = (test*)malloc(sizeof(test));
strcpy(p->name,"jim");
printf("%s\n",p->name);
return 0;
}
以上程序运⾏的时候,编译没问题,但会出现崩溃,原因在于 strcpy(p->name,"jim");因为 test *p = malloc()只是创建了对象的⼤⼩,并没有使 p 中的name变量指向⼀段可⽤地址,因为malloc()创建时,由于 对象 struct T中的 name 是指针,只有4个字节⼤⼩,并且没有指向,所以是个 野指针 ,所以往野指针赋值很容易会出现程序崩溃的。
要修改的话,只要把:
typedef struct T
{
char name[20]; //指针改成数组即可
int num;
}test;
或者:
typedef struct T
{
char *name;
int num;
}test;
int main()
{
test *p = (test*)malloc(sizeof(test));
p->name= (char*)malloc(50);
strcpy(p->name,"hello world");
printf("%s\n",p->name);
return 0;
}
改成这样也可以,只要给结构体的 name指针 指向⼀段可取的内存就没问题了。
但现在⼜有⼀个问题:
因为下⾯的代码⼜没有问题的:
int main()
{
char *name;
strcpy(name,"vincent");
printf("%s\n",name);
return 0;
}
这⾥char *name 也是野指针,但为什么⼜不会出现问题呢?
这样写也是不应该的,因为往野指针赋值始终都有危险,因为不知道会往哪⾥赋值,估计这⾥不会出问题是跟编译器有关,但最好不要这样做,因为这是⼀个潜在的BUG。
记住:不能往野指针赋值!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论