一.首先先看代码:
struct data
{
char * name;
int level;
char skill;
};
struct data a;
a.name = "你好呀";
scanf("%s",a.name);
printf("%s",a.name);
为什么这里printf,为什么会异常,输出不了值?
这里我们需要深刻的理解以下内容:
二.指针变量
int a;
int * b = &a;
指针变量b在指向a变量的时候,并不是存储a变量的内存地址,而是引用a的内存地址,所以其实指针变量b是不存储任何东西的,也没有任何的内存大小的,它只是一个引用。
三.字符串内存地址的引用
char * a = "你好呀";
这里也是同样的道理,a并没有任何的内存大小,只是引用到你好呀这个字符串的内存地址。
四.指针指向字符串常量的话,那么字符串就是不可变的。
char * a = "你好呀";
此时该字符串是不可变的,是存储在只读区域,而不可以进行修改
如下列代码:
struct data
{
char * name;
int level;
char skill;
};
struct data a;
a.name = "你好呀";
scanf("%s",a.name);
printf("%s",a.name);
因为,此时字符串是只读类型,不可以修改。所以,想用scanf将其内容进行修改,然后再printf时会发生输出异常。
那么如何对这个字符串进行修改呢?
因为此时字符串在只读区域,所以我们只要将其从只读区域中放到可修改区域即可。
通过:
a.name = (char *)malloc(50);
也就是
struct data
{
char * name;
int level;
char skill;
};
struct data a;
a.name = "你好呀";
a.name = (char *)malloc(50);
scanf("%s",a.name);
printf("%s",a.name);
就可以对其字符串进行修改,使用动态内存分配,可以将其从只读拉到可修改区域。
需要注意的问题
在使用动态分配内存时,比如:malloc,分配内存大小时,要注意分配,如果太小,也许输出正常(有时候会错误),但从安全角度,还是有些危险的。因为scanf输入的内容可以乱指向其他空间,会造成系统错误
另外记得释放内存空间
free(a.name);