c语言 结构体 字符串常量 指针内存空间问题 初始化的时候已经自动分配内存了,为什么还说指针没有分配内存

一.首先先看代码:

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值