Linux、C基本问题解析
2019-09-18 11:45 C#成长路 阅读(113) 评论(0) 收藏 举报1.malloc,free和new,delete的区别。
(1)我认为new\delete和malloc\free最大区别是对对象的理解。
如果你使用
Foo* foo = malloc(sizeof(Foo));//Foo是一个类
初始化,那么你将不会调用Foo的构造方法,而只是单纯的分配空间。而且我们只认为你是分配一个空间,而不是想创建一个对象。
Foo* foo = new Foo();则会调用Foo的构造方法来初始化对象,也就是说你既要分配空间又要初始化这段空间,让它变成一个对象。
对于delete和free也有同样的问题,就是delete会调用析构函数,free则不会。
说白了,new\delete玩的是对象,而malloc\free仅仅是内存空间而已
(2) 对于除去对象意外的其他情况,比如int和float等
int* Array=new int[10];和int* Array=malloc(sizeof(int)*10);只存在使用技巧的差别,没有本质的差别。
(3)最后也提醒你new\delete和malloc\free只能成对使用,不能混了。
2.C语言中volite的作用
volatile是易变的,不稳定的意思,volatile是关键字,是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等,遇到这个关键字声明的变量,编译器对访问该变量的代码不在进行优化,从而可以提供对特殊地址的稳定访问。
volatile 关键字告诉编译器该变量是随时可能发生变化的,每次使用它的时候必须从内存中取出他的值,因而编译器生成的汇编代码会从原内存地址中读取数据使用。
如果一个寄存器或者变量表示一个端口或者多个线程的共享数据,就容易出错,所以volatile可以保证对特殊地址的稳定访问。
3.关于sizeof,参数分别是数组,字符串的时候的值
(1)当计算数组时,
sizeof获得是占用内存的大小,单位是字节
int test[]={1,1,1};
std::cout<<sizeof(test)<<endl;
此时输出12,三个int型元素,每一个在32位系统中是4byte(字节),那么就是3*4=12字节。
(2)当char数组表示字符串时,
char test[]="hello";
std::cout<<sizeof(test)<<endl;
此时输出6,5个char类型元素+一个末尾‘\0’空字符,char是一个字节,因此一共6字节。
注:如果char arr[] = {'1', '2', '3'};
std::cout<<sizeof(arr)<<endl;
此时输出3,3个char类型元素,每一个是1字节,因此一共3字节。
浙公网安备 33010602011771号