C语言 strcpy()函数的崩溃探索

先看一个代码:

#include <stdio.h> 
#include <string.h>

typedef struct T
{
    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。
记住:不能往野指针赋值!



  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值