1.下面两个结构体在#pragma pack(4)和pragma pack(8)的情况下,结构体的大小分别是:
struct One
{
double d;
char c;
int i;
}
struct Two
{
char c;
double d;
int i;
}
许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐。
每个特定平台上的编译器都有自己的默认“对齐系数”(32位机一般为4,64位机一般为8)。我们可以通过预编译命令#pragma pack(k),k=1,2,4,8,16来改变这个系数,其中k就
是需要指定的“对齐系数”;也可以使用#pragma pack()取消自定义字节对齐方式。
struct 或者 union 成员对齐规则如下:
1. 第一个数据成员放在offset为0的地方,对齐按照对齐系数和自身占用字节数中,二者比较小的那个进行对齐;
2. 在数据成员完成各自对齐以后,struct或者union本身也要进行对齐,对齐将按照对齐系数和struct或者union中最大数据成员长度中比较小的那个进行;
3.先局部成员对齐,然后再全局对齐。
实际占位用1表示,补位用0表示
#pragma pack(4)
One的大小:
1111 d
1111 d
1000 c
1111 i
共4+4+4+4=16
Two的大小:
1000 c
1111 d
1111 d
1111 i
共4+4+4+4=16
#pragma pack(8)
One的大小:
1111 1111 d
1111 1000 c占一位,i紧挨着占4位,再补3位对齐
共8+8=16
Two的大小:
1000 0000 c
1111 1111 d
1111 0000 i
共8+8+8=24
所以结果为16 ,16,16,24。
2.下面哪种C/C++分配内存的方法会将分配的空间初始化为0?
A malloc()
B calloc()
C realloc()
D new()
(1)malloc 函数: void *malloc(unsigned int size)
在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。
(2)calloc 函数: void *calloc(unsigned int num, unsigned int size)
按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。
calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。
(3)realloc 函数: void *realloc(void *ptr, unsigned int size)
动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。
申请的内存空间不会进行初始化。
(4)new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分
配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。
所以是calloc。
3.开发c代码时,经常见到如下类型的结构体定义:
typedef struct list_t
{
struct list_t *next;
struct list_t *prev;
char data[0];
} list_t;
请问在32位系统中,sizeof(list_t)的值为?
柔性数组:把单一元素数组放在一个struct 的尾端,使得每个struct对象可以拥有可变大小的数组。
开始题目中的char data[0]或写成char data[],即为柔性数组
data不占用struct的空间,只是作为一个符号地址存在。因此sizeof的值是两个指针所占的字节。
4.下面程序出错在什么阶段?
#include <iostream>
using namespace std;
int main(int argc,char * * argv)
{
cout<<"welcome to sogou<< endl;
return 0;
}
main函数可以接受两个参数int main(int argc,char *argv[]),argc=arguments count表示参数个数,argv=argument
vector表示数组指针,同时数组在参数传递时会转义为指针,即使[]中包含维度也会被忽略!所以char *argv[]等价于
char **argv。“welcome to sogou"是以‘\0'结尾的字符常量数组,可以直接输出。所以程序正确。