先看一个代码:
#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。
记住:不能往野指针赋值!