几个C语言中的易混淆点

1.数据类型的字节数
int类型通常代表特定机器的自然长度,可以是16位或32位;short类型通常是16位;long类型通常是32位
类型的位数一般只对编译器可见,位数是多少可用sizeof来看,各编译器可根据硬件的特性自主的选择类型位数,但必须遵循特定的规则:short型和int型至少为16位,long型至少为32位,而且short不得超过int型,int型不得超过long型。有一点是编译器在自主选择类型时要受到OS位数的限制,而OS又要受到CPU可寻址位数的限制,32的CPU当然最大为32位(不过听说可扩展……)。

2.结构体

结构体所占内存大小问题:

结构体所占内存大小与结构体的对齐方式有关
编译器为了优化cpu读取内存的效率,在生成结构体成员的起始地址时遵循着某种特定的规则,这就是所谓的“内存对齐”方式。这个规则为“对于n个字节(n=1、2、4、、、、就是short、int等)的元素,它的首地址能被n整除”;而且结构体中的成员在内存中是顺序存放的,所占内存地址一次增高,第一个字节出于低地址处,最后一个字节位于搞地址处,但结构体成员的内存分配不一定是连续的,编译器会按照前面介绍的成员对齐方式进行处理。 其实每个编译器也可以设置一个默认的对齐方式n,但这个n并不一定是实际的对齐方式,实际对每个元素的对齐参数N要按照这个原则:“N=min(sizeof(成员变量),n)”进行分配,最后整体的要求是:“对这个结构体所占用的内存一定是其成员中最大对齐参数N(与编译器的默认参数比较过的)的最小整数倍,不足时补空字节”【另外结构体对齐的具体实现也与硬件有关,就是CPU的“字节序”问题,有的是“小端”有的是“大端”】

什么时候为结构体分配内存?:
其实在C++中结构体和类没什么区别,只是变量的默认权限不一样,在这里也可以当做类来理解,就是当只写:typedef struct _temp{...}时,只是定义了一个类,并没有对齐实例化,当然也就没有为其分配内存,当用struct _temp temp;定义了一个变量temp,也就是相当于创建了一个实例,也就分配了内存,只是这时,在这个变量中的成员的地址中存放的并不是你想要的值,什么乱七八糟的值都有可能,所以在定义之后最好初始化。


3.在C中有没有string类型
  在C中没有string类型,在C++中才有,在C中string就是以‘\0’结尾的字符数组,而且在C中也不可能写一个替代,因为在C++中string类型是数据和操作封装在一起的,在C不可能实现,但在C中在string.h中定义了strstr( ,)、strncat( , , )等对字符数组(也就是字符串)的处理函数。在C++中使用string类型时,也要调用<string>头文件,注意这里在新的C++中不用<string.h>,而与C中的string.h相对应的库函数在<cstring>中,注意<cstring.h>库函数已经废弃,还有在使用<string>这一类头文件中的函数、变量时,最好用“using namespaces std;”(不过也有的说“在使用stl空间中的类/函数/模板时才使用这一句”)防止重名。

4.char *a="abc"与char a[]="abc"的区别
  一个在栈中,一个在堆中

char *a="abc":

其中"abc”存放在常量存储区,a存放在栈中,a指向"abc"在常量存储区的首地址,常量存储区中的内容为只读,不可修改,a[0]='e';//错误;在编译的过程中进行初始化,在程序结束时由系统释放。

char a[]="abc":

存放在栈中,在程序运行的过程中初始化,可修改内容,a[0]='e';//ok,在程序执行完其作用域时释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值