米6体育app-咱们平直在编译器运行代码即可
你的位置:米6体育app > 米6体育 > 咱们平直在编译器运行代码即可
咱们平直在编译器运行代码即可
发布日期:2022-02-16 12:53    点击次数:170

咱们平直在编译器运行代码即可

01 缘由

在上篇著述《STM32编程中陈设和结构体的聚拢》中,有读者对下列代码有疑问

typedef 米6体育appstruct{   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; } 

留言到

默认情况下,Hive会执行多次表扫描。因此,如果要在某张hive表中执行多个操作,建议使用一次扫描并使用该扫描来执行多个操作。

很显着,这位读者意志到了name成员是个指针,在莫得对指针分拨内存时,就平直复制“xiaoming”字符串,这是无理的。先说下论断,这个是莫得问题的,不才文我会详备说明下。

米6体育app平台客服QQ:865083652 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个字符的标的。

骨子上因为name指针指向的是Flash,不错通过上头的身手进行读取操作,可是弗成按上头身手进行写入操作。

若是按底下的写法,读取和写入的操作的操作都是莫得问题的,因为name指针指向的是内存,具有可读可写的属性。

xiaoming.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,就应该在指针的名字中体现到,这个不同公司有不同的定名程序,每个人也有每个人的程序,这里不在演示了。

本文转载自微信公众号「贯通编程」

【剪辑推选】

Kubernetes容器平台架构解读 支付宝 App 集五福版发布:福相伴,五福,立地到! Windows 11 22526新版开发多量问题!新特质抢先看 WiFi7有多强?比WiFi6高三倍,速率快如飞 Python再获年度编程说话,微软或成最大赢家