在上篇著作《STM32编程中排列和结构体的集中》中宝马会骰宝,有读者对下列代码有疑问
typedef 宝马会骰宝struct{ char *name; //姓名 int num; //学号 int age; //年岁 float score; //获利 }stuff_s; stuff_s xiaoming; void xiaoming_inf_init() { xiaoming.name = "xiaoming"; xiaoming.num = 1; xiaoming.age = 18.0; xiaoming.score = 100; }
留言到
6868百家乐很彰着,这位读者领略到了name成员是个指针,在莫得对指针分派内存时,就径直复制“xiaoming”字符串,这是失误的。先说下论断,这个是莫得问题的,鄙人文我会详备说明下。
02 说明率先,实践是教练真谛的独一圭臬,咱们径直在编译器运行代码即可,这里我使用的是IAR编译,在VisualStudio中运行效果亦然通常的,这里我使用IAR为例
不错看到,运行莫得问题的,name成员被通俗赋值。这里瞩目name指针指向的位置是0x8002A5C,这是在flash的地址范围,也即是编译器径直把“xiaoming”字符串放到了flash中,动作一个常量,然后把这个常量的指针赋给name指针,是以毋庸提前给name指针央求内存空间。对于STM32的内存分派,不错看之前推文《C谈话在STM32中的内存分派》。这么写亦然正当且正确的,虽然咱们最熟谙表情如下
xiaoming.name = (char *)malloc(10); memcpy(xiaoming.name,"xiaoming",8); xiaoming.num = 1; xiaoming.age = 18.0; xiaoming.score = 100; free(xiaoming.name);
运行效果如下
不错看出,name指针是指向内存的,和刚运转的代码是有鉴识的。那么像刚运转的写法,如下
xiaoming.name = "xiaoming";
编译通俗,运行通俗,在使用中有什么按捺吗?谜底是有的
char test_char; xiaoming.name = "xiaoming"; test_char = xiaoming.name[2];
这么写是正确的,test_char不错被正确的赋值字符a;但如下写法是失误的
xiaoming.name = "xiaoming"; xiaoming.name[2] = 'Q';
这么写不错编译通过,履行的时辰也不报错,然则并不成达到修改第3个字符的宗旨。
zh皇冠手机网址多少坚韧欧博棋牌游戏注册送彩金践诺上因为name指针指向的是Flash,不错通过上头的秩序进行读取操作,然则不成按上头秩序进行写入操作。
博彩平台注册送免费体育赛事与足球明星XXX同框合影,网友纷纷猜测他是加入他的球队了吗?如若按底下的写法,读取和写入的操作的操作都是莫得问题的,因为name指针指向的是内存,具有可读可写的属性。
皇冠体育appxiaoming.name = (char *)malloc(10); memcpy(xiaoming.name,"xiaoming",8); xiaoming.num = 1; xiaoming.age = 18.0; xiaoming.score = 100; free(xiaoming.name);
是以日常代码编写中需要瞩目这些,我的不雅点是:按照上述秩序,欧博娱乐开户先对指针央求内存,然后再赋值。
虽然,万事莫得王人备,需要视情况而定,下列情况,你也不错径直将字符串赋给指针
阐明指针不会有写入操作,唯独读操作,且你以为多加一句memcpy语句影响你的代码运行速率了。
阐明指针不会有写入操作,唯独读操作,且系统莫得富足的内存给指针央求了。
03 const关节字上文既然提到了只读属性,那么咱们就再说一下const关节字。大家先看如下代码操作
typedef struct{ const char *name; //姓名 int num; //学号 int age; //年岁 float score; //获利 }stuff_s; stuff_s xiaoming; int main(void) { xiaoming.name = (char *)malloc(10); memcpy(xiaoming.name,"xiaoming",8); xiaoming.name[2] = 'Q'; xiaoming.num = 1; xiaoming.age = 18.0; xiaoming.score = 100; free(xiaoming.name); }
指针name前加了const关节字,这段代码在IAR编译器中是根蒂编译欠亨过的。
原因很浅薄,即是因为指针name具有const属性,不成被写入。
是以,在上一节最有一部分说到,当你阐明指针不会有写入操作,唯独读操作,你不错在这个指针界说前加一个const属性,因为技俩代码不是你一个保重的,你策划时以为这个指针唯独读操作,就加const,这么别东谈主进行写造访时径直就会在IAR报错,而不会将这个荫藏的隐患留传在居品中。
虽然,上文界说的const char *name;亦然不模范的,当这个指针加了const,就应该在指针的名字中体现到,这个不同公司有不同的定名模范,每个东谈主也有每个东谈主的模范,这里不在演示了。
多氟多(002407)在8月8日被媒体曝光有意参与重整,公司当日晚间披露公告回应称,确实以联合体形式参与了破产重整投资人的招募和遴选条件。在7月,联创股份(300343)也曾宣布拟参与本次破产重整。
皇冠客服飞机:@seo3687本文转载自微信公众号「解析编程」
【裁剪保举】
Kubernetes容器平台架构解读 支付宝 App 集五福版发布:福相伴,五福,飞快到! Windows 11 22526新版竖立大宗问题!新特点抢先看 WiFi7有多强?比WiFi6高三倍,速率快如飞 Python再获年度编程谈话,微软或成最大赢家