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

先看一个代码:

#include  
#include 

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



你可能感兴趣的:(C语言,strcpy)