代码改变世界

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字节。